bzoj 4695 最假女选手
吉司机线段树部分操作板题
支持区间取$max$,$min$,区间加
区间查询最大值 最小值和区间和
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define db double 4 #define ld long double 5 #define ull unsigned long long 6 #define MAXN 500100 7 #define MOD 1000000007 8 #define Fill(a,x) memset(a,x,sizeof(a)) 9 #define rep(i,s,t) for(int i=(s),i##end=(t);i<=i##end;++i) 10 #define dwn(i,s,t) for(int i=(s),i##end=(t);i>=i##end;--i) 11 #define ren for(int i=fst[x];i;i=nxt[i]) 12 #define pls(a,b) (a+b)%MOD 13 #define mns(a,b) (a-b+MOD)%MOD 14 #define mul(a,b) (1LL*(a)*(b))%MOD 15 #define pii pair<int,int> 16 #define fi first 17 #define se second 18 #define pb push_back 19 using namespace std; 20 inline int read() 21 { 22 int x=0,f=1;char ch=getchar(); 23 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 24 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 25 return x*f; 26 } 27 const int inf=1e9; 28 inline void chkmx(int &x,int y){x=max(x,y);} 29 inline void chkmn(int &x,int y){x=min(x,y);} 30 int n,m,g[MAXN]; 31 struct maxi{int val,sval,cnt,tag;}; 32 maxi operator + (maxi a,maxi b) 33 { 34 static maxi res;res.cnt=res.tag=0; 35 res.val=max(a.val,b.val),res.sval=max(a.sval,b.sval); 36 if(a.val!=res.val) chkmx(res.sval,a.val); 37 else res.cnt+=a.cnt; 38 if(b.val!=res.val) chkmx(res.sval,b.val); 39 else res.cnt+=b.cnt; 40 return res; 41 } 42 maxi operator + (maxi a,int w) 43 { 44 static maxi res;res=a; 45 res.val+=w,res.sval+=w; 46 return res; 47 } 48 struct mini{int val,sval,cnt,tag;}; 49 mini operator + (mini a,mini b) 50 { 51 static mini res;res.cnt=res.tag=0; 52 res.val=min(a.val,b.val),res.sval=min(a.sval,b.sval); 53 if(a.val!=res.val) chkmn(res.sval,a.val); 54 else res.cnt+=a.cnt; 55 if(b.val!=res.val) chkmn(res.sval,b.val); 56 else res.cnt+=b.cnt; 57 return res; 58 } 59 mini operator + (mini a,int w) 60 { 61 static mini res;res=a; 62 res.val+=w,res.sval+=w; 63 return res; 64 } 65 struct node{maxi mxi;mini mni;ll sum,tag;}tr[MAXN<<2]; 66 inline void upd(int k) 67 { 68 tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum; 69 tr[k].mxi=tr[k<<1].mxi+tr[k<<1|1].mxi; 70 tr[k].mni=tr[k<<1].mni+tr[k<<1|1].mni; 71 } 72 inline void Add(int k,int l,int r,int w) 73 { 74 tr[k].mxi=tr[k].mxi+w,tr[k].mni=tr[k].mni+w; 75 tr[k].tag+=w,tr[k].sum+=1LL*w*(r-l+1); 76 } 77 inline void Mdfmx(int k,int l,int r,int w) 78 { 79 if(tr[k].mxi.val==tr[k].mni.val) 80 { 81 tr[k].mxi.val+=w,tr[k].mni.val+=w; 82 tr[k].tag+=w,tr[k].sum+=1LL*w*(r-l+1); 83 return ; 84 } 85 if(tr[k].mxi.val==tr[k].mni.sval) tr[k].mni.sval+=w; 86 tr[k].mxi.val+=w,tr[k].mxi.tag+=w; 87 tr[k].sum+=1LL*tr[k].mxi.cnt*w; 88 } 89 inline void Mdfmn(int k,int l,int r,int w) 90 { 91 if(tr[k].mni.val==tr[k].mxi.val) 92 { 93 tr[k].mni.val+=w,tr[k].mxi.val+=w; 94 tr[k].tag+=w,tr[k].sum+=1LL*w*(r-l+1); 95 return ; 96 } 97 if(tr[k].mni.val==tr[k].mxi.sval) tr[k].mxi.sval+=w; 98 tr[k].mni.val+=w,tr[k].mni.tag+=w; 99 tr[k].sum+=1LL*tr[k].mni.cnt*w; 100 } 101 inline void pshd(int k,int l,int r,int mid) 102 { 103 if(tr[k].tag) 104 { 105 Add(k<<1,l,mid,tr[k].tag); 106 Add(k<<1|1,mid+1,r,tr[k].tag); 107 tr[k].tag=0; 108 } 109 if(tr[k].mxi.tag) 110 { 111 int tmp=tr[k].mxi.tag;tr[k].mxi.tag=0; 112 if(tr[k<<1].mxi.val==tr[k<<1|1].mxi.val) 113 {Mdfmx(k<<1,l,mid,tmp);Mdfmx(k<<1|1,mid+1,r,tmp);} 114 else if(tr[k<<1].mxi.val>tr[k<<1|1].mxi.val) 115 Mdfmx(k<<1,l,mid,tmp); 116 else Mdfmx(k<<1|1,mid+1,r,tmp); 117 } 118 if(tr[k].mni.tag) 119 { 120 int tmp=tr[k].mni.tag;tr[k].mni.tag=0; 121 if(tr[k<<1].mni.val==tr[k<<1|1].mni.val) 122 {Mdfmn(k<<1,l,mid,tmp);Mdfmn(k<<1|1,mid+1,r,tmp);} 123 else if(tr[k<<1].mni.val<tr[k<<1|1].mni.val) 124 Mdfmn(k<<1,l,mid,tmp); 125 else Mdfmn(k<<1|1,mid+1,r,tmp); 126 } 127 } 128 void build(int k,int l,int r) 129 { 130 if(l==r) {tr[k]={{g[l],-inf,1,0},{g[l],inf,1,0},g[l],0};return ;} 131 int mid=l+r>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r); 132 upd(k); 133 } 134 void add(int k,int l,int r,int a,int b,int w) 135 { 136 if(a<=l&&r<=b) {Add(k,l,r,w);return ;} 137 int mid=l+r>>1;pshd(k,l,r,mid); 138 if(a<=mid) add(k<<1,l,mid,a,b,w); 139 if(b>mid) add(k<<1|1,mid+1,r,a,b,w); 140 upd(k); 141 } 142 void mdfmn(int k,int l,int r,int w) 143 { 144 if(tr[k].mni.val>=w) return ; 145 if(tr[k].mni.sval>w) {Mdfmn(k,l,r,w-tr[k].mni.val);return ;} 146 int mid=l+r>>1;pshd(k,l,r,mid); 147 mdfmn(k<<1,l,mid,w);mdfmn(k<<1|1,mid+1,r,w); 148 upd(k); 149 } 150 void mdfmx(int k,int l,int r,int w) 151 { 152 if(tr[k].mxi.val<=w) return ; 153 if(tr[k].mxi.sval<w) {Mdfmx(k,l,r,w-tr[k].mxi.val);return ;} 154 int mid=l+r>>1;pshd(k,l,r,mid); 155 mdfmx(k<<1,l,mid,w);mdfmx(k<<1|1,mid+1,r,w); 156 upd(k); 157 } 158 void mdf1(int k,int l,int r,int a,int b,int w,int t) 159 { 160 if(a<=l&&r<=b) {t?mdfmx(k,l,r,w):mdfmn(k,l,r,w);return ;} 161 int mid=l+r>>1;pshd(k,l,r,mid); 162 if(a<=mid) mdf1(k<<1,l,mid,a,b,w,t); 163 if(b>mid) mdf1(k<<1|1,mid+1,r,a,b,w,t); 164 upd(k); 165 } 166 ll query(int k,int l,int r,int a,int b) 167 { 168 if(a<=l&&r<=b) return tr[k].sum; 169 int mid=l+r>>1;ll res=0;pshd(k,l,r,mid); 170 if(a<=mid) res=query(k<<1,l,mid,a,b); 171 if(b>mid) res+=query(k<<1|1,mid+1,r,a,b); 172 return res; 173 } 174 int getmx(int k,int l,int r,int a,int b) 175 { 176 if(a<=l&&r<=b) return tr[k].mxi.val; 177 int mid=l+r>>1,res=-inf;pshd(k,l,r,mid); 178 if(a<=mid) res=getmx(k<<1,l,mid,a,b); 179 if(b>mid) res=max(getmx(k<<1|1,mid+1,r,a,b),res); 180 return res; 181 } 182 int getmn(int k,int l,int r,int a,int b) 183 { 184 if(a<=l&&r<=b) return tr[k].mni.val; 185 int mid=l+r>>1,res=inf;pshd(k,l,r,mid); 186 if(a<=mid) res=getmn(k<<1,l,mid,a,b); 187 if(b>mid) res=min(getmn(k<<1|1,mid+1,r,a,b),res); 188 return res; 189 } 190 int main() 191 { 192 n=read();rep(i,1,n) g[i]=read();build(1,1,n); 193 int a,b,c;rep(Q,1,read()) 194 { 195 c=read(),a=read(),b=read(); 196 if(c==1) {c=read();add(1,1,n,a,b,c);} 197 else if(c==2) {c=read();mdf1(1,1,n,a,b,c,0);} 198 else if(c==3) {c=read();mdf1(1,1,n,a,b,c,1);} 199 else if(c==4) printf("%lld\n",query(1,1,n,a,b)); 200 else if(c==5) printf("%d\n",getmx(1,1,n,a,b)); 201 else printf("%d\n",getmn(1,1,n,a,b)); 202 } 203 }