• 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
  • 相关阅读:
    bzoj1084
    bzoj1088 [SCOI2005]扫雷
    [LUOGU] 1892 团伙
    [普及组] 2017 成绩
    [LUOGU] P2661 信息传递
    [LUOGU] P1339 [USACO09OCT]热浪Heat Wave
    [LUOGU] P1828 香甜的黄油 Sweet Butter
    [模板] 单源最短路径
    [LUOGU] 1717 钓鱼
    [UVA] 704 Colour Hash
  • 原文地址:https://www.cnblogs.com/yyc-jack-0920/p/15173076.html
Copyright © 2020-2023  润新知