标签:
学习线段树的第三天。。。真的是没学点啥好的,又是一道水题,纯模板,我个人觉得我的线段树模板还是不错的(毕竟我第一天相当于啥都没学。。。找了一整天模板,对比了好几个,终于找到了自己喜欢的类型),中文题目嘛,直接上代码
我感觉我的代码有一个特点吧...有点啰嗦,但是每一行的思维和上一行紧密相连,新手看的话不会感到思维的跃迁,比较容易看懂,因为我之前看一些大神的代码,确实看到一半就不知道他下面啥意思了...所以希望我的代码能够造福新手吧=。=
1 #include<cstdio> 2 #include<string> 3 #include<iostream> 4 #define N 50003 5 using namespace std; 6 int num[50003]; 7 char s[5]; 8 struct nod 9 { 10 int data,l,r; 11 }tree[N*4];//树型结构的要花费更多的空间,这里要*4 12 13 void push_up(int i)//通过i节点的孩子节点更新i节点 14 { 15 tree[i].data = tree[i*2].data + tree[i*2+1].data; 16 } 17 18 void Build_tree(int i,int l,int r) 19 { 20 tree[i].l = l; 21 tree[i].r = r; 22 if(l == r){ 23 tree[i].data = num[l]; 24 return ; 25 } 26 int mid = (l + r)/2; 27 Build_tree(i*2,l,mid); 28 Build_tree(i*2+1,mid+1,r); 29 push_up(i); 30 } 31 32 void update(int i,int k,int v) 33 { 34 if(tree[i].l==k&&tree[i].r==k){//单点更新只要找到特定的k节点就算找到,区间更新要找到一个区间→看我另一篇文章吧 35 tree[i].data += v;//注意题目意思是增加或减少V个人,所以是+= 36 return; 37 } 38 int mid = (tree[i].l + tree[i].r)/2; 39 if(k <= mid) 40 update(i*2,k,v); 41 else 42 update(i*2+1,k,v); 43 push_up(i); 44 } 45 46 int query(int i,int l,int r) 47 { 48 if(l<=tree[i].l&&tree[i].r<=r){ 49 return tree[i].data; 50 } 51 int mid = (tree[i].l + tree[i].r)/2; 52 if(r <= mid) //这里看不懂的看我另一篇文章http://www.cnblogs.com/liwenchi/p/5761257.html 53 return query(i*2,l,r); 54 if(l > mid) 55 return query(i*2+1,l,r); 56 return query(i*2,l,r)+query(i*2+1,l,r); 57 } 58 59 int main() 60 { 61 int noc,ug; //ug这名字随便起的...case数等于ug-noc,noc也是随便起的...number of case 62 scanf("%d",&noc); 63 ug = noc; 64 while(noc--) 65 { 66 int n,l,r,i,j; 67 scanf("%d",&n); 68 for(int i=1;i<=n;i++) 69 scanf("%d",&num[i]); 70 Build_tree(1,1,n); 71 printf("Case %d:\n",ug-noc); 72 while(scanf("%s",s)) 73 { 74 if(s[0] == ‘E‘) break; 75 if(s[0] == ‘Q‘){ 76 scanf("%d%d",&l,&r); 77 printf("%d\n",query(1,l,r)); 78 } 79 else if(s[0] == ‘A‘){ 80 scanf("%d%d",&i,&j); 81 update(1,i,j); 82 } 83 else{ 84 scanf("%d%d",&i,&j);//减人数的话把j取负再更新就OK了 85 update(1,i,-j); 86 } 87 } 88 } 89 }
如果有哪里不懂可以看看我其他线段树的文章,都是很基础的!
【原创】hdu 1166 敌兵布阵(线段树→单点更新,区间查询)
标签:
原文地址:http://www.cnblogs.com/liwenchi/p/5764647.html