2018.07.27 bzoj3064: Tyvj 1518 CPU监控(线段树)
传送门
线段树好题。
维护区间加,区间覆盖,区间最大,区间历史最大。
这个东西在国家集训队2016论文集之《区间最值操作与历史最值问题——杭州学军中学 吉如一》中讲的已经很详细了。
简单来说是这样的:
我们先考虑没有区间覆盖的情况,如果只有区间加的话,我们维护一个标记historyhistoryhistory_addaddadd来表示当前区间在上一次区间加之后最大的历史加标记,这样的话可以用这个标记来更新历史最大值。
然后如果有了区间覆盖操作,不难证明一个区间在区间覆盖之后每一次区间加操作都相当于一次区间覆盖操作,因此我们类似地维护一个historysethistory_sethistoryset来对历史最大值进行更新。
代码(add[0]add[0]add[0]->普通区间加标记,set[0]set[0]set[0]->普通覆盖标记,add[1]add[1]add[1]->历史区间加标记,set[1]set[1]set[1]->历史覆盖标记):
#include<iostream>
#include<cstring>
#include<cstdio>
#define inf 0x3f3f3f3f
#define N 100005
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
using namespace std;
inline int read(){int ans=0,w=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();return ans*w;
}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar((x%10)^48);
}
int a[N],n,q;
struct Node{int l,r,add[2],set[2],his,mx;}T[N<<2];
inline int max(int a,int b){return a>b?a:b;}
inline void pushup(int p){T[p].mx=max(T[lc].mx,T[rc].mx),T[p].his=max(T[lc].his,T[rc].his);}
inline void pushadd(int p,int v){T[p].his=max(T[p].his,T[p].mx+=v);if(T[p].set[0]!=-inf)T[p].set[1]=max(T[p].set[1],T[p].set[0]+=v);else T[p].add[1]=max(T[p].add[1],T[p].add[0]+=v);
}
inline void pushset(int p,int v){T[p].set[1]=max(T[p].set[1],T[p].set[0]=v),T[p].add[0]=0;T[p].his=max(T[p].his,T[p].mx=v);
}
inline void his_add(int p,int v){T[p].his=max(T[p].his,T[p].mx+v);if(T[p].set[0]!=-inf)T[p].set[1]=max(T[p].set[1],T[p].set[0]+v);else T[p].add[1]=max(T[p].add[1],T[p].add[0]+v);
}
inline void his_set(int p,int v){T[p].set[1]=max(T[p].set[1],v),T[p].his=max(T[p].his,v);}
inline void pushdown(int p){if(T[p].add[1])his_add(lc,T[p].add[1]),his_add(rc,T[p].add[1]),T[p].add[1]=0;if(T[p].set[1]!=-inf)his_set(lc,T[p].set[1]),his_set(rc,T[p].set[1]),T[p].set[1]=-inf;if(T[p].add[0])pushadd(lc,T[p].add[0]),pushadd(rc,T[p].add[0]),T[p].add[0]=0;if(T[p].set[0]!=-inf)pushset(lc,T[p].set[0]),pushset(rc,T[p].set[0]),T[p].set[0]=-inf;
}
inline void build(int p,int l,int r){T[p].l=l,T[p].r=r,T[p].set[0]=T[p].set[1]=-inf,T[p].add[0]=T[p].add[1]=0;if(l==r){T[p].his=T[p].mx=a[l];return;}build(lc,l,mid),build(rc,mid+1,r),pushup(p);
}
inline void update(int p,int ql,int qr,int v){if(ql>T[p].r||qr<T[p].l)return;if(ql<=T[p].l&&T[p].r<=qr)return pushadd(p,v);pushdown(p);if(qr<=mid)update(lc,ql,qr,v);else if(ql>mid)update(rc,ql,qr,v);else update(lc,ql,mid,v),update(rc,mid+1,qr,v);pushup(p);
}
inline void modify(int p,int ql,int qr,int v){if(ql>T[p].r||qr<T[p].l)return;if(ql<=T[p].l&&T[p].r<=qr)return pushset(p,v);pushdown(p);if(qr<=mid)modify(lc,ql,qr,v);else if(ql>mid)modify(rc,ql,qr,v);else modify(lc,ql,mid,v),modify(rc,mid+1,qr,v);pushup(p);
}
inline int query(int p,int ql,int qr){if(ql>T[p].r||qr<T[p].l)return -inf;if(ql<=T[p].l&&T[p].r<=qr)return T[p].mx;pushdown(p);if(qr<=mid)return query(lc,ql,qr);if(ql>mid)return query(rc,ql,qr);return max(query(lc,ql,mid),query(rc,mid+1,qr));
}
inline int query_his(int p,int ql,int qr){if(ql>T[p].r||qr<T[p].l)return -inf;if(ql<=T[p].l&&T[p].r<=qr)return T[p].his;pushdown(p);if(qr<=mid)return query_his(lc,ql,qr);if(ql>mid)return query_his(rc,ql,qr);return max(query_his(lc,ql,mid),query_his(rc,mid+1,qr));
}
int main(){n=read();for(int i=1;i<=n;++i)a[i]=read();build(1,1,n);q=read();while(q--){char s[20];scanf("%s",s);int l=read(),r=read();switch(s[0]){case 'Q':{write(query(1,l,r)),puts("");break;}case 'A':{write(query_his(1,l,r)),puts("");break;}case 'P':{int v=read();update(1,l,r,v);break;}default:{int v=read();modify(1,l,r,v);break;}}}return 0;
}
2018.07.27 bzoj3064: Tyvj 1518 CPU监控(线段树)相关推荐
- BZOJ #3064. Tyvj 1518 CPU监控(线段树,历史最值)
BZOJ #3064. Tyvj 1518 CPU监控(线段树,历史最值) Solution 我们考虑用线段树维护此题. 先不考虑历史最值. 大概需要维护一种特殊的懒标记(x,y)(x,y)(x,y) ...
- 2018.07.30 bzoj4355: Play with sequence(线段树)
传送门 维护区间覆盖成非负数,区间变成max(xi+a,0)max(xi+a,0),询问区间中00的个数. 由于每次操作之后区间中都是非负数,因此相当于只用维护最小值和最小值的个数. 对于将一个区间变 ...
- BZOJ 5249: [2018多省省队联测]IIIDX(贪心 + 线段树)
题意 这一天,\(\mathrm{Konano}\) 接到了一个任务,他需要给正在制作中的游戏 \(\mathrm{<IIIDX>}\) 安排曲目 的解锁顺序.游戏内共有\(n\) 首曲目 ...
- 2018.8.4T2(贪心,dp,线段树,优先队列)
给定一个偶数 N,现在蔡老板得到了一个由 [1,N] 内的所有偶数构成的排列 b[1..N/2] 现在蔡老板又得到了一个数组 a[1..N/2],其中 a[i]=i∗2−1 蔡老板想知道,对于所有满足 ...
- 【地狱副本】数据结构之线段树Ⅲ——区间最值/赋值/修改/历史值操作(HDU5306,Tyvj 1518,【清华集训2015】V,HDU6315,HDU1828,POJ3162)
文章目录 Gorgeous Sequence Tyvj 1518 CPU监控 [清华集训2015]V Naive Operations Picture Walking Race Gorgeous Se ...
- AIX系统CPU监控与评估
AIX系统CPU监控与评估 一, VMSTAT命令(CPU) 1.1 cpu 1.2 kthr(内核等待) 1.3 faults故障 1.4 memory(内存) 1.5 page磁盘交换 二, io ...
- 【跃迁之路】【530天】刻意练习系列289(2018.07.20)
@(跃迁之路)专栏 叨叨两句 技术的精进不能只是简单的刷题,而应该是不断的"刻意"练习 该系列改版后正式纳入[跃迁之路]专栏,持续更新 一.语言练习 SQL [跃迁之路]SQL语句 ...
- 2018.07.30 巴别时代
* 项目部署更新 用符号链接 project => project1, project2 ln -s project2 project * composer自动加载机制 namespace =& ...
- 2018.07.19 仿优酷网页小项目
时间:2018.07.19 大一下学期暑假 地点:成都-实习 项目类型:HTML+CSS仿优酷网页 制作时间:两天 网页源码: <!doctype html> <html> & ...
- Linux性能监控(CPU监控)
Linux性能监控(CPU监控) 主要分为四类: cup监控 内存监控命令 IO性能 网络性能 cup监控 关于CPU,有3个重要的概念:上下文切换(context switchs),运行队列(Run ...
最新文章
- python数字类型-Python3 - 数字类型
- double,float,BigDecimal类型数值的操作
- linux查看服务依赖关系图,技术|教你如何在Fedora,CentOS,RHEL中检查RPM包的依赖性
- 环境变量空格符号带来的坑
- java设置等待锁的时间_java的锁池和等待池
- 将servlet[login]标记为不可用_30分钟上手OUTLOOK - 邮件标记
- LR 监控mysql
- LeetCode160相交链表
- 《Linux私房菜》——一、linux基础整理
- 断点下载神器-RandomAccessFile
- MATLAB之牛顿插值法
- 电脑硬盘图标换成自己喜欢的图标
- linux如何打出罗马数字,ps罗马数字怎么打
- 保留数据和程序win7升级win10,平滑升级,完美!
- 解决unable to find valid certification path to requested target
- Unity批量替换文字字体自制工具
- 【能效管理】关于学校预付费水电系统云平台应用分析介绍
- 子类调用父类构造器《转载》
- BIM技术全过程咨询服务如何打响建筑革命?
- 自动化测试在美团外卖的实践与落地