标签:fine 技术 png return start 别人 node std +=
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
线段树模板题(然而模板题也阻挡不住我不会的脚步···)
寒假的时候也只是简单入门,现在又给忘光了,一点都不会了,没办法,只能找一道模板题来参考别人代码写,然后改代码。(这个不是好习惯,只是我这也学更快一些,不适用所有人)
只有最简单的区间增减与区间查询
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 6 using namespace std; 7 8 #define N 100001 9 #define INF 0x7fffffff 10 11 int num[N]; 12 struct node 13 { 14 int l,r; 15 int sum; 16 int mid() 17 { 18 return (l+r)/2; 19 } 20 }tree[N*4]; 21 22 void BuildTree(int root,int l,int r) 23 { 24 tree[root].l = l; 25 tree[root].r = r; 26 if(l == r) 27 { 28 tree[root].sum = num[l]; 29 return ; 30 } 31 BuildTree(root*2,l,(l+r)/2); 32 BuildTree(root*2+1,(l+r)/2+1,r); 33 tree[root].sum = tree[root*2].sum+tree[root*2+1].sum; 34 } 35 36 // root:根节点 i:修改的点 t:改变的值(正为增负为减) 37 void add(int root,int i,int t) 38 { 39 tree[root].sum += t; 40 if(tree[root].l == i && tree[root].r == i) 41 return ; 42 if(i <= tree[root].mid()) 43 add(root*2,i,t); 44 else 45 add(root*2+1,i,t); 46 } 47 48 // root:根节点 s:start e:end 49 int query(int root,int s,int e) 50 { 51 if(tree[root].l == s && tree[root].r == e) 52 return tree[root].sum; 53 if(e <= tree[root].mid()) 54 return query(root*2,s,e); 55 else 56 if(s > tree[root].mid()) 57 return query(root*2+1,s,e); 58 else 59 return query(root*2,s,tree[root].mid())+query(root*2+1,tree[root].mid()+1,e); 60 } 61 62 int main() 63 { 64 int ca = 1; 65 int T,n,i,k,t; 66 string s; 67 cin >> T; 68 while(T--) 69 { 70 printf("Case %d:\n",ca++); 71 cin >> n; 72 for(i = 1;i <= n;i++) 73 scanf("%d",&num[i]); 74 BuildTree(1,1,n); 75 while(cin >> s) 76 { 77 if(s == "End") 78 break; 79 scanf("%d %d",&k,&t); 80 if(s == "Add") 81 add(1,k,t); 82 else 83 { 84 if(s == "Sub") 85 add(1,k,-t); 86 else 87 cout << query(1,k,t) << endl; 88 } 89 } 90 } 91 return 0; 92 }
标签:fine 技术 png return start 别人 node std +=
原文地址:https://www.cnblogs.com/duny31030/p/8869709.html