3064: Tyvj 1518 CPU监控

注意这题要维护历史最大加和历史最大覆盖

  1 /**************************************************************
  2     Problem: 3064
  3     User: white_hat_hacker
  4     Language: C++
  5     Result: Accepted
  6     Time:3868 ms
  7     Memory:15288 kb
  8 ****************************************************************/
  9  
 10 #include<cstdio>
 11 #include<cstdlib>
 12 #include<algorithm>
 13 #include<cstring>
 14 #define INF 0x7f7f7f7f
 15 #define MAXN 100010 
 16 #define rint register int 
 17 using namespace std;
 18 int read(){
 19     int x=0,f=1;char ch=getchar();
 20     while(ch<'0'||ch>'9'){if('-'==ch)f=-1;ch=getchar();}
 21     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
 22     return x*f;
 23 }
 24 #define lc k<<1
 25 #define rc k<<1|1
 26 struct SegmentTree{
 27     struct Node{
 28         int L,R;
 29         int vl,_vl;
 30         int add,_add;
 31         int cov,_cov;
 32         bool iscov;
 33     }st[MAXN<<2];
 34     int s[MAXN];
 35     void pushup(int k){
 36         st[k].vl=max(st[lc].vl,st[rc].vl);
 37         st[k]._vl=max(st[lc]._vl,st[rc]._vl);
 38     }
 39     void workcov(int k,int cov,int _cov){
 40         st[k].iscov=true;
 41         st[k]._vl=max(st[k]._vl,_cov);
 42         st[k]._cov=max(st[k]._cov,_cov);
 43         st[k].vl=cov;
 44         st[k].cov=cov;
 45         st[k].add=0;
 46     }
 47     void workadd(int k,int add,int _add){
 48         if(st[k].iscov){
 49             workcov(k,st[k].cov+add,st[k].cov+_add);
 50         }
 51         else{
 52             st[k]._vl=max(st[k]._vl,st[k].vl+_add);
 53             st[k]._add=max(st[k]._add,st[k].add+_add);
 54             st[k].vl+=add;
 55             st[k].add+=add;
 56         }
 57     }
 58     void pushdown(int k){
 59         int c=k<<1;
 60         for(rint i=0;i<=1;i++){
 61             c|=i;
 62             workadd(c,st[k].add,st[k]._add);
 63             if(st[k].iscov)
 64                 workcov(c,st[k].cov,st[k]._cov);
 65         }
 66         st[k].iscov=false;
 67         st[k].add=st[k]._add=0;
 68         st[k].cov=st[k]._cov=-INF;
 69     }
 70     void build(int k,int L,int R){
 71         st[k].L=L,st[k].R=R;
 72         st[k].cov=st[k]._cov=-INF;
 73         if(L==R){
 74             st[k].vl=st[k]._vl=s[L];
 75         }
 76         else{
 77             int mid=(L+R)>>1;
 78             build(lc,L,mid);
 79             build(rc,mid+1,R);
 80             pushup(k);
 81         }
 82     }
 83     void add(int k,int a,int b,int v){
 84         int L=st[k].L,R=st[k].R;
 85         int mid=(L+R)>>1;
 86         if(a<=L&&R<=b){
 87             workadd(k,v,v);
 88         }
 89         else{
 90             pushdown(k);
 91             if(a<=mid)add(lc,a,b,v);
 92             if(b>mid)add(rc,a,b,v);
 93             pushup(k);
 94         }
 95     }
 96     void cov(int k,int a,int b,int v){
 97         int L=st[k].L,R=st[k].R;
 98         int mid=(L+R)>>1;
 99         if(a<=L&&R<=b){
100             workcov(k,v,v);
101         }
102         else{
103             pushdown(k);
104             if(a<=mid)cov(lc,a,b,v);
105             if(b>mid)cov(rc,a,b,v);
106             pushup(k);
107         }
108     }
109     int query(int k,int a,int b){
110         int L=st[k].L,R=st[k].R;
111         int mid=(L+R)>>1;
112         if(a<=L&&R<=b){
113             return st[k].vl;
114         }
115         else{
116             pushdown(k);
117             int ans=-INF;
118             if(a<=mid)ans=max(ans,query(lc,a,b));
119             if(b>mid)ans=max(ans,query(rc,a,b));
120             return ans;
121         }
122     }
123     int _query(int k,int a,int b){
124         int L=st[k].L,R=st[k].R;
125         int mid=(L+R)>>1;
126         if(a<=L&&R<=b){
127             return st[k]._vl;
128         }
129         else{
130             pushdown(k);
131             int ans=-INF;
132             if(a<=mid)ans=max(ans,_query(lc,a,b));
133             if(b>mid)ans=max(ans,_query(rc,a,b));
134             return ans;
135         }
136     }
137 }ST;
138 #undef lc
139 #undef rc
140 int n;
141 int main()
142 {
143     n=read();
144     for(rint i=1;i<=n;i++){
145         ST.s[i]=read();
146     }
147     ST.build(1,1,n);
148     int T=read();
149     char s[5];
150     int x,y,z;
151     while(T--){
152         scanf("%s%d%d",s,&x,&y);
153         if('Q'==s[0])printf("%d\n",ST.query(1,x,y));
154         else if('A'==s[0])printf("%d\n",ST._query(1,x,y));
155         else{
156             scanf("%d",&z);
157             if('P'==s[0])ST.add(1,x,y,z);
158             else ST.cov(1,x,y,z);
159         }
160     }
161     return 0;
162 }

 

posted @ 2018-03-06 20:14  white_hat_hacker  阅读(167)  评论(0编辑  收藏  举报