1. 程式人生 > >C - A Simple Problem with Integers POJ - 3468 線段樹模版(區間查詢區間修改)

C - A Simple Problem with Integers POJ - 3468 線段樹模版(區間查詢區間修改)

線段樹模版 amp else 計算 更新 namespace scanf spa ger

參考qsc大佬的視頻 太強惹 先膜一下 視頻在b站 直接搜線段樹即可

 1 #include<cstdio>
 2 using namespace std;
 3 const int maxn=1e5+6;
 4 int n,a[maxn];
 5 struct Node{
 6     int l,r;
 7     long long sum,lazy;
 8     void update(long long x){//用於更新區間和 和懶標記
 9         sum+=1ll*(r-l+1)*x;
10         lazy+=x;
11     }
12 }tree[maxn*4
]; 13 void push_up(int x){//用於用子區間重新計算該區間的區間和 14 tree[x].sum=tree[x<<1].sum+tree[x<<1|1].sum; 15 } 16 void push_down(int x){//把lazy標記往下面傳遞 17 int lazyval=tree[x].lazy; 18 if(lazyval){ 19 tree[x<<1].update(lazyval); 20 tree[x<<1|1].update(lazyval); 21 tree[x].lazy=0
; 22 } 23 } 24 void build(int x,int l,int r){//建樹 25 tree[x].l=l,tree[x].r=r; 26 tree[x].sum=tree[x].lazy=0; 27 if(l==r){ 28 tree[x].sum=a[l]; 29 } 30 else { 31 int mid=l+r>>1; 32 build(x<<1,l,mid); 33 build(x<<1|1,mid+1,r); 34 push_up(x);
35 } 36 } 37 void update(int x,int l,int r,long long val){//區間修改 38 int L=tree[x].l,R=tree[x].r; 39 if(l<=L&&R<=r){//完全包含直接修改就行 40 tree[x].update(val); 41 } 42 else {//push_down 把懶標記往下面傳 43 push_down(x);//不是完全包含 繼續往下面修改包含的區間l ,r 不用改它是用來判斷當前區間位不位於要修改的區間裏面的,如果位於那麽就要修改 44 int mid=L+R>>1; 45 if(mid>=l)update(x<<1,l,r,val); 46 if(r>mid)update(x<<1|1,l,r,val); 47 push_up(x);//已經更新好了子區間重新計算區間和 48 } 49 } 50 long long query(int x,int l,int r){//查詢l,r區間 x是節點標號 和上面update類似 51 int L=tree[x].l,R=tree[x].r; 52 if(l<=L&&R<=r){ 53 return tree[x].sum; 54 } 55 else { 56 push_down(x); 57 long long ans=0; 58 int mid=L+R>>1; 59 if(mid>=l)ans+=query(x<<1,l,r); 60 if(r>mid)ans+=query(x<<1|1,l,r); 61 push_up(x); 62 return ans; 63 } 64 } 65 int main(){ 66 int q; 67 scanf("%d%d",&n,&q); 68 for(int i=1;i<=n;i++)scanf("%d",&a[i]); 69 build(1,1,n); 70 for(int i=1;i<=q;i++){ 71 int l,r,val; 72 char op[10]; 73 scanf("%s",op); 74 if(op[0]==C){ 75 scanf("%d%d%d",&l,&r,&val); 76 update(1,l,r,val); 77 } 78 else { 79 scanf("%d%d",&l,&r); 80 printf("%lld\n",query(1,l,r)); 81 } 82 } 83 84 return 0; 85 }

C - A Simple Problem with Integers POJ - 3468 線段樹模版(區間查詢區間修改)