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监控 学习一番线段树的历史标记- 这道题就是区间加法,区间赋值,要询问区间最大值 和 区间历史最大值的最大值. 然后这种题就是在现有标记的基础上多弄一套标记,维护这个点出现过的最大的标 ...
随机推荐
- python 单向链表实现
单链表的操作 is_empty() 链表是否为空 length() 链表长度 travel() 遍历整个链表 add(item) 链表头部添加元素 append(item) 链表尾部添加元素 inse ...
- Spring MVC Restful Put方法无法获取参数值
Spring MVC Restful 无法通过@ReqeustParam获取参数值 原因是Tomcat只支持POST/GET获取参数值,对于PUT这些方法需要通过HttpPutFormContentF ...
- python解释NTFS runlist的代码(文章转自北亚数据恢复张宇工程师)
代码如下: 执行效果如下:root@zhangyu-VirtualBox:~/NTFS-5# python3 read_runlist.py mft_source.img ***参数数量或格式错误! ...
- JAVA_SE基础——58.如何用jar命令对java工程进行打包
有时候为了更方便快捷的部署和执行Java程序,要把java应用程序打包成一个jar包.而这个基础的操作有时候也很麻烦,为了方便java程序员们能够方便的打包java应用程序,下面对jar命令进行介绍, ...
- python之celery的使用(一)
前段时间需要使用rabbitmq做写缓存,一直使用pika+rabbitmq的组合,pika这个模块虽然可以很直观地操作rabbitmq,但是官方给的例子太简单,对其底层原理了解又不是很深,遇到很多坑 ...
- Centos7.x:开机启动服务的配置和管理
一.开机启动服务的配置 1.创建服务配置(权限754) vim /usr/lib/systemd/system/nginx.service 文件内容解释 [Unit]:服务的说明Description ...
- python入门:python包管理工具pip的安装
pip 是一个安装和管理 Python 包的工具 , 是 easy_install 的一个替换品. distribute是setuptools的取代(Setuptools包后期不再维护了),pip是e ...
- Angular 学习笔记 ( PWA + App Shell )
PWA (Progressive Web Apps) 是未来网页设计的方向. 渐进式网站. Angular v5 开始支持 pwa 网站 (所谓支持意思是说有一些 build in 的方法和规范去实现 ...
- gradle入门(1-5)创建并运行Web应用
一.使用Gretty运行Web应用 Gretty支持Jetty和Tomcat,它不会被Gradle缺少SLF4J绑定所导致的问题所困扰. 1.配置文件build.gradle buildscript ...
- python之路——初识函数
阅读目录 为什么要用函数 函数的定义与调用 函数的返回值 函数的参数 本章小结 返回顶部 为什么要用函数 现在python届发生了一个大事件,len方法突然不能直接用了... 然后现在有一个需求,让你 ...