3064: Tyvj 1518 CPU监控
注意这题要维护历史最大加和历史最大覆盖
/**************************************************************
Problem: 3064
User: white_hat_hacker
Language: C++
Result: Accepted
Time:3868 ms
Memory:15288 kb
****************************************************************/ #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define INF 0x7f7f7f7f
#define MAXN 100010
#define rint register int
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if('-'==ch)f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
#define lc k<<1
#define rc k<<1|1
struct SegmentTree{
struct Node{
int L,R;
int vl,_vl;
int add,_add;
int cov,_cov;
bool iscov;
}st[MAXN<<];
int s[MAXN];
void pushup(int k){
st[k].vl=max(st[lc].vl,st[rc].vl);
st[k]._vl=max(st[lc]._vl,st[rc]._vl);
}
void workcov(int k,int cov,int _cov){
st[k].iscov=true;
st[k]._vl=max(st[k]._vl,_cov);
st[k]._cov=max(st[k]._cov,_cov);
st[k].vl=cov;
st[k].cov=cov;
st[k].add=;
}
void workadd(int k,int add,int _add){
if(st[k].iscov){
workcov(k,st[k].cov+add,st[k].cov+_add);
}
else{
st[k]._vl=max(st[k]._vl,st[k].vl+_add);
st[k]._add=max(st[k]._add,st[k].add+_add);
st[k].vl+=add;
st[k].add+=add;
}
}
void pushdown(int k){
int c=k<<;
for(rint i=;i<=;i++){
c|=i;
workadd(c,st[k].add,st[k]._add);
if(st[k].iscov)
workcov(c,st[k].cov,st[k]._cov);
}
st[k].iscov=false;
st[k].add=st[k]._add=;
st[k].cov=st[k]._cov=-INF;
}
void build(int k,int L,int R){
st[k].L=L,st[k].R=R;
st[k].cov=st[k]._cov=-INF;
if(L==R){
st[k].vl=st[k]._vl=s[L];
}
else{
int mid=(L+R)>>;
build(lc,L,mid);
build(rc,mid+,R);
pushup(k);
}
}
void add(int k,int a,int b,int v){
int L=st[k].L,R=st[k].R;
int mid=(L+R)>>;
if(a<=L&&R<=b){
workadd(k,v,v);
}
else{
pushdown(k);
if(a<=mid)add(lc,a,b,v);
if(b>mid)add(rc,a,b,v);
pushup(k);
}
}
void cov(int k,int a,int b,int v){
int L=st[k].L,R=st[k].R;
int mid=(L+R)>>;
if(a<=L&&R<=b){
workcov(k,v,v);
}
else{
pushdown(k);
if(a<=mid)cov(lc,a,b,v);
if(b>mid)cov(rc,a,b,v);
pushup(k);
}
}
int query(int k,int a,int b){
int L=st[k].L,R=st[k].R;
int mid=(L+R)>>;
if(a<=L&&R<=b){
return st[k].vl;
}
else{
pushdown(k);
int ans=-INF;
if(a<=mid)ans=max(ans,query(lc,a,b));
if(b>mid)ans=max(ans,query(rc,a,b));
return ans;
}
}
int _query(int k,int a,int b){
int L=st[k].L,R=st[k].R;
int mid=(L+R)>>;
if(a<=L&&R<=b){
return st[k]._vl;
}
else{
pushdown(k);
int ans=-INF;
if(a<=mid)ans=max(ans,_query(lc,a,b));
if(b>mid)ans=max(ans,_query(rc,a,b));
return ans;
}
}
}ST;
#undef lc
#undef rc
int n;
int main()
{
n=read();
for(rint i=;i<=n;i++){
ST.s[i]=read();
}
ST.build(,,n);
int T=read();
char s[];
int x,y,z;
while(T--){
scanf("%s%d%d",s,&x,&y);
if('Q'==s[])printf("%d\n",ST.query(,x,y));
else if('A'==s[])printf("%d\n",ST._query(,x,y));
else{
scanf("%d",&z);
if('P'==s[])ST.add(,x,y,z);
else ST.cov(,x,y,z);
}
}
return ;
}
3064: Tyvj 1518 CPU监控的更多相关文章
- bzoj 3064: Tyvj 1518 CPU监控
Description 1.区间加 \(z\) 2.区间覆盖为 \(z\) 3.查询区间最大值 4.查询区间历史最大值 Solution 线段树维护历史最值,思想大致是维护标记出现过的最大值 考虑这种 ...
- [补档][Tyvj 1518]CPU监控
[Tyvj 1518]CPU监控 题目 Bob需要一个程序来监视CPU使用率.这是一个很繁琐的过程,为了让问题更加简单,Bob会慢慢列出今天会在用计算机时做什么事. Bob会干很多事,除了跑暴力程序看 ...
- bzoj3064 Tyvj 1518 CPU监控
Description Bob需要一个程序来监视CPU使用率.这是一个很繁琐的过程,为了让问题更加简单,Bob会慢慢列出今天会在用计算机时做什么事. Bob会干很多事,除了跑暴力程序看视频之外,还会做 ...
- 【bzoj3064】Tyvj 1518 CPU监控 线段树维护历史最值
题目描述 给你一个序列,支持4种操作:1.查询区间最大值:2.查询区间历史最大值:3.区间加:4.区间赋值. 输入 第一行一个正整数T,表示Bob需要监视CPU的总时间. 然后第二行给出T个数表示在你 ...
- Tyvj 1518 CPU监控(线段树)
题目描述: Bob需要一个程序来监视CPU使用率.这是一个很繁琐的过程,为了让问题更加简单,Bob会慢慢列出今天会在用计算机时做什么事. Bob会干很多事,除了跑暴力程序看视频之外,还会做出去玩玩和用 ...
- Tyvj 1518 CPU监控——极恶线段树
题目大意: 给定一个区间及其各个元素的初值,要求支持如下操作: 1.区间加 2.区间赋值 3.查询区间最大值 4.查询区间历史最大值 分析: 容易想到线段树,但是细思恶极(仔细想想恶心到了极点)的是, ...
- BZOJ3064 Tyvj 1518 CPU监控 线段树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3064 题意概括 一个序列,要你支持以下操作: 1. 区间询问最大值 2. 区间询问历史最大值 3. ...
- 2018.07.27 bzoj3064: Tyvj 1518 CPU监控(线段树)
传送门 线段树好题. 维护区间加,区间覆盖,区间最大,区间历史最大. 这个东西在国家集训队2016论文集之<区间最值操作与历史最值问题--杭州学军中学 吉如一>中讲的已经很详细了. 简单来 ...
- BZOJ 3064 CPU监控
题目链接:CPU监控 学习一番线段树的历史标记- 这道题就是区间加法,区间赋值,要询问区间最大值 和 区间历史最大值的最大值. 然后这种题就是在现有标记的基础上多弄一套标记,维护这个点出现过的最大的标 ...
随机推荐
- Rails 定时任务——whenever实现周期性任务
根据项目的进展,我们需要实现后台进行定时读取信息的功能,而最关键的实现部分是周期性功能,根据调研,决定使用whenever来实现这一功能. github:https://github.com/java ...
- C语言的第一次作业
一.PTA实验作业 题目1. 温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1.实验 ...
- python实现朴素贝叶斯
参考:<机器学习实战>- Machine Learning in Action 一. 基本思想 简单的说,用概率的高低来决定数据属于哪一类别,这就是贝叶斯决策理论的核心思想,即选择具有最 ...
- 2017-2018-1 1623 bug终结者 冲刺004
bug终结者 冲刺004 by 20162322 朱娅霖 整体连接 简要说明 目前,我们已经完成了欢迎界面,主菜单界面,排行榜界面,选项界面,胜利界面,地板类.小人类.墙体类.箱子类和虚拟按键类. 主 ...
- 第201621123043 《Java程序设计》第13周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 系统还在创建中..... 为了让你 ...
- Lock(三)查看是谁把表给锁了
查看是谁把表给锁了 select se1.inst_id as 被阻塞的会话节点, se2.inst_id as 罪魁祸首节点, se1.sid as 被阻塞的会话ID, ob.object_name ...
- Python内置函数(33)——any
英文文档: any(iterable) Return True if any element of the iterable is true. If the iterable is empty, re ...
- matlab 对tif数据高程图的处理分析
temp=z(101:2200,101:2200) 根据图像属性可得此为2300*2300的tif图像,由于需要将其划分为9宫格,所以begin点设置为101,end点设置为2200,temp转化为可 ...
- maven快速下载jar镜像
<!--国内镜像--><mirror> <id>CN</id> <name>OSChina Central</name> ...
- Linux之Shell命令
开始接触Linux命令行,学习Linux文件系统导航以及创建.删除.处理文件所需的命令. 注:文末有福利! 几个快捷键: Linux发行版通常使用Ctrl+Alt组合键配合F1~F7进入要使用的控制 ...