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
",query(1,1,n,a,b));
200         else if(c==5) printf("%d
",getmx(1,1,n,a,b));
201         else printf("%d
",getmn(1,1,n,a,b));
202     }
203 }
View Code
原文地址:https://www.cnblogs.com/yyc-jack-0920/p/15173076.html