首页 > 代码库 > 数据结构--线段树
数据结构--线段树
线段树 好久没做全部忘记了 还得重新学一下了
线段树--单点更新
HUD1166
题意:中文题
思路:线段树的单点更新
AC代码
1 #include "iostream" 2 #include "string.h" 3 #include "stack" 4 #include "queue" 5 #include "string" 6 #include "vector" 7 #include "set" 8 #include "map" 9 #include "algorithm" 10 #include "stdio.h" 11 #include "math.h" 12 #define ll long long 13 #define mem(a) memset(a,0,sizeof(a)) 14 using namespace std; 15 16 struct Node{ 17 int l,r; 18 int sum; 19 }; 20 Node Tree[100000<<2]; 21 22 void Build_Tree(int root, int l, int r) 23 { 24 Tree[root].l=l; 25 Tree[root].r=r; 26 if(l==r) 27 { 28 scanf("%d",&Tree[root].sum); 29 return; 30 } 31 int mid=l+r>>1; 32 Build_Tree(root*2+1,l,mid); 33 Build_Tree(root*2+2,mid+1,r); 34 Tree[root].sum=Tree[root*2+1].sum+Tree[root*2+2].sum; 35 } 36 37 int Query(int root,int l,int r) 38 { 39 if(Tree[root].l==l && Tree[root].r==r) 40 return Tree[root].sum; 41 int mid=Tree[root].l+Tree[root].r>>1; 42 if(r<=mid) 43 return Query(root*2+1,l,r); 44 if(l>mid) 45 return Query(root*2+2,l,r); 46 else 47 return Query(root*2+1,l,mid)+Query(root*2+2,mid+1,r); 48 } 49 50 void Update_One(int root,int l,int r,int p,int add) 51 { 52 if(l==r) 53 { 54 Tree[root].sum += add; 55 return; 56 } 57 int mid=l+r>>1; 58 if(p<=mid) Update_One(root*2+1,l,mid,p,add); 59 else Update_One(root*2+2,mid+1,r,p,add); 60 Tree[root].sum=Tree[root*2+1].sum + Tree[root*2+2].sum; 61 } 62 63 int main() 64 { 65 int t,c=0,n,l,r; 66 string s; 67 scanf("%d",&t); 68 while(t--){ 69 printf("Case %d:\n",++c); 70 scanf("%d",&n); 71 mem(Tree); 72 Build_Tree(0,0,n-1); 73 while(cin>>s&&s!="End") 74 { 75 scanf("%d%d",&l,&r); 76 if(s=="Query") printf("%d\n",Query(0,l-1,r-1)); 77 else if(s=="Add") Update_One(0,0,n-1,l-1,r); 78 else Update_One(0,0,n-1,l-1,-r); 79 } 80 } 81 return 0; 82 }
HDU1754
题意:中文题
思路:线段树的单点更新
代码有时间补上
数据结构--线段树
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。