zoukankan      html  css  js  c++  java
  • 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
    ",ST.query(1,x,y));
    154         else if('A'==s[0])printf("%d
    ",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 }
  • 相关阅读:
    找水王续
    大道至简-阅读笔记01
    第二阶段冲刺(第二天)
    第二阶段冲刺(第一天)
    找小水王
    《大道至简》阅读笔记02——关于项目经理
    学习进度第十二周
    找水王
    学习进度第十一周
    博客园用户体验
  • 原文地址:https://www.cnblogs.com/w-h-h/p/8516497.html
Copyright © 2011-2022 走看看