1. 程式人生 > >【luogu P2023 [AHOI2009]維護序列】 題解

【luogu P2023 [AHOI2009]維護序列】 題解

line lazy fine 題解 new res ati names OS

題目鏈接:https://www.luogu.org/problemnew/show/P2023

把P3373改一改直接粘過來就A

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <algorithm>
  4 #include <cstring>
  5 #define lson left, mid, rt<<1
  6 #define rson mid+1, right, rt<<1|1
  7 #define ll long long
  8
using namespace std; 9 const int maxn = 100010; 10 ll n, m, addlazy[maxn<<2], mullazy[maxn<<2], ans[maxn<<2], mod, x,y,k; 11 void PushUP(ll rt) 12 { 13 ans[rt] = (ans[rt<<1] + ans[rt<<1|1])%mod; 14 } 15 void build(ll left, ll right, ll rt) 16 { 17 addlazy[rt] = 0
; 18 mullazy[rt] = 1; 19 if(right == left) 20 { 21 scanf("%d",&ans[rt]); 22 return ; 23 } 24 ll mid = (left+right) >> 1; 25 build(lson); 26 build(rson); 27 PushUP(rt); 28 } 29 void PushDOWN(ll rt, ll mid, ll left, ll right)
30 { 31 mullazy[rt<<1]=(mullazy[rt<<1]*mullazy[rt])%mod; 32 mullazy[rt<<1|1]=(mullazy[rt<<1|1]*mullazy[rt])%mod; 33 addlazy[rt<<1]=(addlazy[rt<<1]*mullazy[rt])%mod; 34 addlazy[rt<<1|1]=(addlazy[rt<<1|1]*mullazy[rt])%mod; 35 ans[rt<<1]=(ans[rt<<1]*mullazy[rt])%mod; 36 ans[rt<<1|1]=(ans[rt<<1|1]*mullazy[rt])%mod; 37 mullazy[rt]=1; 38 addlazy[rt<<1]=(addlazy[rt<<1]+addlazy[rt])%mod; 39 addlazy[rt<<1|1]=(addlazy[rt<<1|1]+addlazy[rt])%mod; 40 ans[rt<<1]=(ans[rt<<1]+(mid-left+1)*addlazy[rt])%mod; 41 ans[rt<<1|1]=(ans[rt<<1|1]+(right-mid)*addlazy[rt])%mod; 42 addlazy[rt]=0; 43 } 44 void mulupdate(ll l, ll r, ll add, ll left, ll right, ll rt) 45 { 46 if(l<=left&&r>=right) 47 { 48 addlazy[rt] = (addlazy[rt]*add)%mod; 49 mullazy[rt] = (mullazy[rt]*add)%mod; 50 ans[rt] = (add*ans[rt])%mod; 51 return; 52 } 53 ll mid = (left+right)>>1; 54 if(mullazy[rt]!=1||addlazy[rt]>=1) PushDOWN(rt,mid,left,right); 55 if(l<=mid) mulupdate(l,r,add,lson); 56 if(r>mid) mulupdate(l,r,add,rson); 57 PushUP(rt); 58 } 59 void addupdate(ll l, ll r, ll add, ll left, ll right, ll rt) 60 { 61 if(l<=left&&r>=right) 62 { 63 addlazy[rt]= (addlazy[rt]+add)%mod; 64 ans[rt] = (ans[rt] + add*(right-left+1))%mod; 65 return; 66 } 67 ll mid = (left+right)>>1; 68 if(mullazy[rt]!=1||addlazy[rt]>=1) PushDOWN(rt,mid,left,right); 69 if(l<=mid) addupdate(l,r,add,lson); 70 if(r>mid) addupdate(l,r,add,rson); 71 PushUP(rt); 72 } 73 ll query(ll l, ll r, ll left, ll right, ll rt) 74 { 75 ll res = 0; 76 if(l <= left&&r >= right) return ans[rt]%mod; 77 ll mid = (left+right) >> 1; 78 if(mullazy[rt]!=1||addlazy[rt]>=1) PushDOWN(rt, mid, left, right); 79 if(l <= mid) res = (res+query(l,r,lson))%mod; 80 if(r > mid) res = (res+query(l,r,rson))%mod; 81 return res%mod; 82 } 83 int main() 84 { 85 scanf("%d%d",&n,&mod); 86 build(1,n,1); 87 scanf("%d",&m); 88 while(m--) 89 { 90 int p; 91 scanf("%d",&p); 92 if(p == 1) 93 { 94 scanf("%d%d%d",&x,&y,&k); 95 mulupdate(x,y,k,1,n,1); 96 } 97 if(p == 2) 98 { 99 scanf("%d%d%d",&x,&y,&k); 100 addupdate(x,y,k,1,n,1); 101 } 102 if(p == 3) 103 { 104 scanf("%d%d",&x,&y); 105 printf("%d\n",query(x,y,1,n,1)); 106 } 107 } 108 return 0; 109 }

【luogu P2023 [AHOI2009]維護序列】 題解