码迷,mamicode.com
首页 > 其他好文 > 详细

[bzoj3064]CPU监控

时间:2019-08-18 15:26:17      阅读:64      评论:0      收藏:0      [点我收藏+]

标签:event   就是   opened   main   监控   spl   namespace   一个   eve   

首先考虑没有区间历史最大值,用线段树维护每一个区间的一个二元组(x,y),表示区间内所有数先加上x在和y取max,然后就要支持标记的修改和合并
修改:如果对(x,y)修改一个(x‘,y‘),那么就是(x+x‘,max(y+x‘,y‘))
合并:如果将(x1,y1)和(x2,y2)合并,那么就是(max(x1,x2),max(y1,y2))
用这个东西就可以维护区间当前最大值了,那么历史最大值也可用同样的方式,只是不能直接覆盖而是对其取max即可

技术图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define N 100005
 4 #define oo 0x3f3f3f3f
 5 #define L (k<<1)
 6 #define R (L+1)
 7 #define mid (l+r>>1)
 8 struct ji{
 9     int a,b;
10 }laz[N<<2],f[N<<2];
11 int n,m,x,y,z,mx[N<<2][2];
12 char s[11];
13 ji max(ji x,ji y){
14     return ji{max(x.a,y.a),max(x.b,y.b)};
15 }
16 ji jia(ji x,ji y){
17     return ji{max(-oo,x.a+y.a),max(x.b+y.a,y.b)};
18 }
19 int calc(ji x,int y){
20     return max(x.a+y,x.b);
21 }
22 void update(int k,ji a,ji b){
23     f[k]=max(f[k],jia(laz[k],b));
24     laz[k]=jia(laz[k],a);
25     mx[k][1]=max(mx[k][1],calc(b,mx[k][0]));
26     mx[k][0]=calc(a,mx[k][0]);
27 }
28 void up(int k){
29     mx[k][0]=max(mx[L][0],mx[R][0]);
30     mx[k][1]=max(mx[L][1],mx[R][1]);
31 }
32 void down(int k){
33     update(L,laz[k],f[k]);
34     update(R,laz[k],f[k]);
35     laz[k]=f[k]={0,-oo};
36 }
37 void build(int k,int l,int r){
38     laz[k]=f[k]=ji{0,-oo};
39     if (l==r){
40         scanf("%d",&mx[k][0]);
41         mx[k][1]=mx[k][0];
42         return;
43     }
44     build(L,l,mid);
45     build(R,mid+1,r);
46     up(k);
47 } 
48 void update(int k,int l,int r,int x,int y,ji z){
49     if ((l>y)||(x>r))return;
50     if ((x<=l)&&(r<=y)){
51         update(k,z,z);
52         return;
53     }
54     down(k);
55     update(L,l,mid,x,y,z);
56     update(R,mid+1,r,x,y,z);
57     up(k);
58 }
59 int query(int k,int l,int r,int x,int y,int z){
60     if ((l>y)||(x>r))return -oo;
61     if ((x<=l)&&(r<=y))return mx[k][z];
62     down(k);
63     return max(query(L,l,mid,x,y,z),query(R,mid+1,r,x,y,z));
64 }
65 int main(){
66     scanf("%d",&n);
67     build(1,1,n);
68     scanf("%d",&m);
69     for(int i=1;i<=m;i++){
70         scanf("%s%d%d",s,&x,&y);
71         if ((s[0]==Q)||(s[0]==A)){
72             printf("%d\n",query(1,1,n,x,y,s[0]==A));
73             continue;
74         }
75         scanf("%d",&z);
76         if (s[0]==P)update(1,1,n,x,y,ji{z,-oo});
77         else update(1,1,n,x,y,ji{-oo,z});
78     }
79 }
View Code

 

[bzoj3064]CPU监控

标签:event   就是   opened   main   监控   spl   namespace   一个   eve   

原文地址:https://www.cnblogs.com/PYWBKTDA/p/11372469.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!