线段树的基础题,然后这几天其实都在撸线段树的题,但是程序老是有问题……然后最后……我觉得……可能我一开始就错了……于是又回来做这道题……果然!!!几乎调试了我!一天!要哭了好吗……原来加法的优先级还高于位运算是吗……没加个括号整个人都不好了…
言归正传。
题意:先给你n个数的一个序列,之后对这个序列进行两种操作,Q,询问某个区间里的最大的数,U,更新某个数。
小tip:结构体数组可以开到一百万,一定要比n的范围大。注意优先级。
撸完这道题,对于数据结构题的差错略有提高,比如看节点,当前范围,各种输出等。
#include <stdio.h> #define maxn 1000000 int n,m; struct node { int l,r,max; }tree[maxn]; int comp(int x,int y) { if(x>y) return x; else return y; } void creat(int l,int r,int u) { tree[u].l=l; tree[u].r=r; if(l==r) { scanf("%d",&tree[u].max); return; } int mid=(l+r)/2; creat(l,mid,u<<1); creat(mid+1,r,(u<<1)+1); tree[u].max=comp(tree[u<<1].max,tree[(u<<1)+1].max); } int query(int l,int r,int u) { int ll=tree[u].l,rr=tree[u].r; int tem1,tem2; if(ll==l&&rr==r) return tree[u].max; int mid=(ll+rr)/2; if(l<=mid&&r<=mid) return query(l,r,u<<1); else if(l>mid) return query(l,r,(u<<1)+1); else return comp(query(l,mid,u<<1),query(mid+1,r,(u<<1)+1)); } void update(int loc,int val,int u) { int ll=tree[u].l,rr=tree[u].r; if(ll==loc&&rr==loc) { tree[u].max=val; return; } int mid=(ll+rr)/2; if(loc<=mid) update(loc,val,u<<1); else update(loc,val,(u<<1)+1); tree[u].max=comp(tree[u<<1].max,tree[(u<<1)+1].max); } int main() { while(scanf("%d%d",&n,&m)!=EOF) { creat(1,n,1); int i,j,k; char s[3],c; for(i=0;i<m;i++) { getchar(); scanf("%c%d%d",&c,&j,&k); if(c=='Q') printf("%d\n",query(j,k,1)); if(c=='U') update(j,k,1); } } return 0; }
还不够好,继续努力。