题目:http://acm.hdu.edu.cn/showproblem.php?pid=1754
线段树。。应该算是线段树的入门题目吧。。
线段树打得太少了。。一点都不熟悉。。需要加强啊。
下面是用数组模拟的线段树的AC代码:
#include<iostream> using namespace std; #define N 200002 struct node { int l,m,r; int score; }trie[N*3]; void creat(int id,int beg,int end) { trie[id].l=beg; trie[id].r=end; trie[id].score=0; trie[id].m=(beg+end)>>1; if(beg<end) { creat(id*2,trie[id].l,trie[id].m); creat(id*2+1,trie[id].m+1,trie[id].r); } } void update(int id,int goal,int val) { if(trie[id].l==goal&&trie[id].r==goal) { trie[id].score=val; return ; } else { if(trie[id].m>=goal) { if(trie[id].score<val) trie[id].score=val; update(id*2,goal,val); //在左子树 } else { if(trie[id].score<val) trie[id].score=val; update(id*2+1,goal,val); //在右子树 } } } void find(int id,int beg,int end,int &max) { if(trie[id].l==beg&&trie[id].r==end) { if(trie[id].score>max) max=trie[id].score; } else { if(trie[id].m>=end) { find(id*2,beg,end,max); } else if(trie[id].m<beg) { find(id*2+1,beg,end,max); } else { find(id*2,beg,trie[id].m,max); find(id*2+1,trie[id].m+1,end,max); } } } int main() { int n,m,i,a,b,temp; char c; while(cin>>n>>m) { creat(1,1,n); for(i=1;i<=n;i++) { scanf("%d",&temp); update(1,i,temp); } for(i=1;i<=m;i++) { getchar(); c=getchar(); if(c=='Q') { scanf("%d%d",&a,&b); int max=0; find(1,a,b,max); printf("%d\n",max); } else { scanf("%d%d",&a,&b); update(1,a,b); } } } return 0; }