首页 > 代码库 > POJ 3264
POJ 3264
这道题作为线段树的入门题吧,不涉及更新。
代码挺长的,所以在敲的时候挺多地方出了问题。
#include<iostream>#include<cstdio>#include<algorithm>using namespace std;const int N = 50010;const int INF = 0x3f3f3f3f;int rmin = INF, rmax = -INF;//用全局变量来储存查询区域的最值struct Node{ int left, right; int maxi, mini; int mid() { return (left+right)>>1; }} tree[4*N];void build(int root, int l, int r)//建树过程{ tree[root].left = l; tree[root].right = r; tree[root].mini = INF; tree[root].maxi = -INF; if(l == r) { return; } else { build(2*root, l, tree[root].mid()); build(2*root+1, tree[root].mid()+1, r); }}void minsert(int root, int pose, int value){ if( tree[root].left == tree[root].right )//找到位置插入 { tree[root].mini = tree[root].maxi = value; return; } tree[root].mini = min(tree[root].mini, value); tree[root].maxi = max(tree[root].maxi, value); if(pose <= tree[root].mid()) minsert(root*2, pose, value); else minsert(root*2 + 1, pose, value);}void query(int root, int s, int e){ if(tree[root].mini > rmin && tree[root].maxi < rmax)/*若某树的最小值大于所求的最小值,则它的子树的最小值必定大于所求最小值,最大值同理*/ return; if(tree[root].left == s && tree[root].right == e) { rmin = min(rmin, tree[root].mini); rmax = max(rmax, tree[root].maxi); return; } if(e <= tree[root].mid()) { query(root*2, s,e); } else if(s > tree[root].mid()) { query(root*2+1, s, e); } else { query(root*2, s, tree[root].mid()); query(root*2+1, tree[root].mid() + 1, e); }}int main(){ int n, q, he, a, b; scanf("%d %d", &n, &q); { build(1,1,n); for(int i = 1; i <= n; i++) { scanf("%d", &he); minsert(1, i, he); } while(q--) { scanf("%d %d", &a, &b); rmin = INF; rmax = -INF; query(0, a, b); printf("%d\n",rmax-rmin); } } return 0;}
从时间上和空间来说都不是很优,但是刚开始学,代码好理解会更好一点。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。