注意这题要维护历史最大加和历史最大覆盖

 /**************************************************************
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监控的更多相关文章

  1. bzoj 3064: Tyvj 1518 CPU监控

    Description 1.区间加 \(z\) 2.区间覆盖为 \(z\) 3.查询区间最大值 4.查询区间历史最大值 Solution 线段树维护历史最值,思想大致是维护标记出现过的最大值 考虑这种 ...

  2. [补档][Tyvj 1518]CPU监控

    [Tyvj 1518]CPU监控 题目 Bob需要一个程序来监视CPU使用率.这是一个很繁琐的过程,为了让问题更加简单,Bob会慢慢列出今天会在用计算机时做什么事. Bob会干很多事,除了跑暴力程序看 ...

  3. bzoj3064 Tyvj 1518 CPU监控

    Description Bob需要一个程序来监视CPU使用率.这是一个很繁琐的过程,为了让问题更加简单,Bob会慢慢列出今天会在用计算机时做什么事. Bob会干很多事,除了跑暴力程序看视频之外,还会做 ...

  4. 【bzoj3064】Tyvj 1518 CPU监控 线段树维护历史最值

    题目描述 给你一个序列,支持4种操作:1.查询区间最大值:2.查询区间历史最大值:3.区间加:4.区间赋值. 输入 第一行一个正整数T,表示Bob需要监视CPU的总时间. 然后第二行给出T个数表示在你 ...

  5. Tyvj 1518 CPU监控(线段树)

    题目描述: Bob需要一个程序来监视CPU使用率.这是一个很繁琐的过程,为了让问题更加简单,Bob会慢慢列出今天会在用计算机时做什么事. Bob会干很多事,除了跑暴力程序看视频之外,还会做出去玩玩和用 ...

  6. Tyvj 1518 CPU监控——极恶线段树

    题目大意: 给定一个区间及其各个元素的初值,要求支持如下操作: 1.区间加 2.区间赋值 3.查询区间最大值 4.查询区间历史最大值 分析: 容易想到线段树,但是细思恶极(仔细想想恶心到了极点)的是, ...

  7. BZOJ3064 Tyvj 1518 CPU监控 线段树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3064 题意概括 一个序列,要你支持以下操作: 1. 区间询问最大值 2. 区间询问历史最大值 3. ...

  8. 2018.07.27 bzoj3064: Tyvj 1518 CPU监控(线段树)

    传送门 线段树好题. 维护区间加,区间覆盖,区间最大,区间历史最大. 这个东西在国家集训队2016论文集之<区间最值操作与历史最值问题--杭州学军中学 吉如一>中讲的已经很详细了. 简单来 ...

  9. BZOJ 3064 CPU监控

    题目链接:CPU监控 学习一番线段树的历史标记- 这道题就是区间加法,区间赋值,要询问区间最大值 和 区间历史最大值的最大值. 然后这种题就是在现有标记的基础上多弄一套标记,维护这个点出现过的最大的标 ...

随机推荐

  1. Ditto在教学上的应用

    Ditto在教学上的应用 我喜欢iOS和macOS生态的一个原因是,你在iphone上看到一段好文字,复制一下,到macbook中粘贴一下就可以了,这体验太爽了. 大家可能相信大家都听过这样一则笑话: ...

  2. C语言第三周作业---单层循环

    一.PTA实验作业 题目1 1.实验代码 int N = 0,i; char sex; float a[9], height; scanf("%d\n", &N); for ...

  3. C++数据结构中的基本算法排序

    冒泡排序 基本思想:两两比较待排序的数,发现反序时交换,直到没有反序为止. public static void BubbleSort(int[] R) { for (int i = 0; i < ...

  4. vue内置指令详解——小白速会

    指令 (Directives) 是带有 v- 前缀的特殊属性,职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM. 内置指令 1.v-bind:响应并更新DOM特性:例如:v-bi ...

  5. (function(root,factory){})(this,function($){}) 一个立即执行的匿名函数自调

    因为新公司用到ocx 我就开始看原来的代码 无意中发现这个 可能原来比较low吗(虽然现在也很low吧)没发现这个东东 还可以这样写 于是乎我开始了探索 完整代码如下 HTML <div id= ...

  6. 【Learning】 多项式的相关计算

    约定的记号 对于一个多项式\(A(x)\),若其最高次系数不为零的项是\(x^k\),则该多项式的次数为\(k\). 记为\(deg(A)=k\). 对于\(x\in(k,+ \infty)\),称\ ...

  7. JQ.ajax 各种参数及属性设置 ( 转载 )

    $.ajax({      type: "post",      url: url,      dataType:'html',      success: function(da ...

  8. js回顾(DOM中标签的CRUD,表格等)

    01-DOM中的创建和添加标签 02-删除替换克隆标签 03-全选全不选反选 04-新闻字体 05-表格增删 06-动态生成表格 07-表格隔行变色 08-左到右右到左(将左边的标签移动到右边) 09 ...

  9. GIT入门笔记(8)-- 查看历史提交记录/根据版本号回到过去或未来

    在Git中,用HEAD表示当前版本,也就是最新的提交版本, 上一个版本就是HEAD^, 上上一个版本就是HEAD^^, 往上100个版本写100个^比较容易数不过来,所以写成HEAD~100. Git ...

  10. C#微信公众号开发——access_token的获取

    access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_toke ...