2018年6月2号(线段树(2))
生活随笔
收集整理的這篇文章主要介紹了
2018年6月2号(线段树(2))
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
昨天只是普通的線段樹(簡單的單點修改)
而今天將講是比較普通的簡單的區間修改(加法修改):
我主要是復制代碼的蒟蒻我只能依靠模板為生,所以我想特地練下手:
1 #include<bits/stdc++.h>//萬能頭文件 2 using namespace std; 3 struct node{ 4 int l,r; 5 long long sum//總和,add//標記(延遲標記); 6 #denfine l(x) tree[x].l; 7 #denfine r(x) tree[x].r; 8 #denfine sum(x) tree[x].sum; 9 #denfine add(x) tree[x].add//宏定義 10 }tree[100001*4]; 11 int a[100001*4],n,m; 12 void build(int p,int l.int r)//建樹 13 { 14 l(p)=l;r(p)=r; 15 if(l==r) {sum(p)=a[l];return ;} 16 int mid=(l+r)/2; 17 build(p*2,l,mid); 18 build(p*2+1,mid+1,r); 19 sum(p)=sum(p*2)+sum(p*2+1); 20 } 21 void spread(int p) 22 { 23 if(add(p))//p節點進行標記; 24 { 25 sum(p*2)+=add(p)*(r(p*2)-l(p*2)+1);//更新左子節點信息 26 sum(p*2+1)+=add(p)*(r(p*2+1)-l(p*2+1)+1);//更新右子節點; 27 add(p*2)+=add(p);//給左子節點打延遲標記; 28 add(p*2+1)+=add(p);//給右子節點打延遲標記; 29 add(p)=0;//消除標記; 30 } 31 } 32 void change(int p,int l,int r) 33 { 34 if(l<=l(p)&&r>=r(p)) 35 { 36 sum(p)+=(long long)d*(r(p)-l(p)+1); 37 add(p)+=d; 38 return ; 39 } 40 spread(p);//下傳延遲標記; 41 int mid(l(p)+r(p))/2; 42 if(l<=mid) change(p*2,l,r,d); 43 if(r>mid) change(p*2+1,l,r,d); 44 sum(p)=sum(p*2)+sum(p*2+1); 45 } 46 long long ask(int p,int l,int r) 47 { 48 if(l<=l(p)&&r>=r(p)) 49 return sum(p); 50 spread(p); 51 int mid=(l(p)+r(p))/2; 52 long long val=0; 53 if(l<=mid) val+=ask(p*2,l,r); 54 if(r>=mid) val+=ask(p*2+1,l,r); 55 return val; 56 } 57 int main() 58 { 59 cin>>n>>m; 60 for(int i=1;i<=n;++i) 61 scanf("%d",a[i]); 62 build(1,1,n);//建樹路口; 63 while(m--) 64 { 65 char op[2]; 66 int l,r,d; 67 scanf("%s%d%d",op,&l,&r); 68 if(op[0]=='c') 69 { 70 scanf("%d".%d); 71 chang(1,1,r,d);//進行修改 72 } 73 else printf("%lld\n",ank(1,l,r)); 74 } 75 }好不容易打完了,可能會有很多錯誤,見諒!
轉載于:https://www.cnblogs.com/zssmg/p/9127571.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的2018年6月2号(线段树(2))的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 余额宝1万一月收益多少
- 下一篇: 参数修饰符 params、in