bzoj 3064: Tyvj 1518 CPU监控
Description
1.区间加 \(z\)
2.区间覆盖为 \(z\)
3.查询区间最大值
4.查询区间历史最大值
Solution
线段树维护历史最值,思想大致是维护标记出现过的最大值
考虑这种情况:
\(x\) 点下方标记,会把儿子的标记给覆盖掉,而儿子的儿子如果有了这个标记就会成为最大值,会影响最终结果
那么我们把标记下放的过程中维护的标记取个 \(max\) 再下放就行了
所以维护四个东西,历史最大值 \(nt\),当前最大值\(pt\),历史最大标记\(lap\),当前标记\(lan\)
每个标记用二元组 \((add,replace)\) 来表示
那么把 \(b\) 合并到 \(a\) 上就是: \((a.x+b.x,max(a.y+b.x,b.y))\)
把标记取 \(max\) 实际上把两维分别取 \(max\)
加法操作就是 \((z,-inf)\) ,覆盖操作就是 \((-inf,z)\)
#include<bits/stdc++.h>
#define ls (o<<1)
#define rs (o<<1|1)
using namespace std;
template<class T>void gi(T &x){
int f;char c;
for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
}
const int N=1e5+10,inf=1e9;
struct data{
int x,y;
data(){}
data(int _x,int _y){x=_x;y=_y;}
inline data operator +(const data &p){
return data(max(x+p.x,-inf),max(y+p.x,p.y));}
inline data operator ^(const data &p){return data(max(x,p.x),max(y,p.y));}
inline bool operator ==(const data &p){return x==p.x&&y==p.y;}
}lan[N*4],lap[N*4],w=data(0,-inf);
int n,Q,nt[N*4],pt[N*4],x,y,z;char s[2];
inline void upd(int o){nt[o]=max(nt[ls],nt[rs]),pt[o]=max(pt[ls],pt[rs]);}
inline void build(int l,int r,int o){
lan[o]=lap[o]=w;
if(l==r){gi(nt[o]);pt[o]=nt[o];return ;}
int mid=(l+r)>>1;
build(l,mid,ls);build(mid+1,r,rs);
upd(o);
}
inline void pushdown(int o){
if(lan[o]==w && lap[o]==w)return ;
for(int i=ls;i<=rs;i++){
lap[i]=lap[i]^(lan[i]+lap[o]);
lan[i]=lan[i]+lan[o];
pt[i]=max(pt[i],max(lap[o].x+nt[i],lap[o].y));
nt[i]=max(nt[i]+lan[o].x,lan[o].y);
}
lan[o]=lap[o]=w;
}
inline void mdf(int l,int r,int o,int sa,int se){
if(sa<=l && r<=se){
data t;
if(s[0]=='P')t=data(z,-inf);
else t=data(-inf,z);
nt[o]=max(nt[o]+t.x,t.y);
pt[o]=max(pt[o],nt[o]);
lan[o]=lan[o]+t;
lap[o]=lap[o]^lan[o];
return ;
}
pushdown(o);
int mid=(l+r)>>1;
if(se<=mid)mdf(l,mid,ls,sa,se);
else if(sa>mid)mdf(mid+1,r,rs,sa,se);
else mdf(l,mid,ls,sa,mid),mdf(mid+1,r,rs,mid+1,se);
upd(o);
}
inline int qry(int l,int r,int o,int sa,int se){
if(sa<=l && r<=se)return s[0]=='Q'?nt[o]:pt[o];
pushdown(o);
int mid=(l+r)>>1;
if(se<=mid)return qry(l,mid,ls,sa,se);
if(sa>mid)return qry(mid+1,r,rs,sa,se);
return max(qry(l,mid,ls,sa,mid),qry(mid+1,r,rs,mid+1,se));
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
cin>>n;
build(1,n,1);
cin>>Q;
while(Q--){
scanf("%s%d%d",s,&x,&y);
if(s[0]=='Q'||s[0]=='A')printf("%d\n",qry(1,n,1,x,y));
else gi(z),mdf(1,n,1,x,y);
}
return 0;
}
bzoj 3064: Tyvj 1518 CPU监控的更多相关文章
- 3064: Tyvj 1518 CPU监控
注意这题要维护历史最大加和历史最大覆盖 /************************************************************** Problem: 3064 Us ...
- [补档][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监控 学习一番线段树的历史标记- 这道题就是区间加法,区间赋值,要询问区间最大值 和 区间历史最大值的最大值. 然后这种题就是在现有标记的基础上多弄一套标记,维护这个点出现过的最大的标 ...
随机推荐
- C++静态成员和非静态成员的区别和使用
C++静态成员和非静态成员的区别和使用 对象与对象之间的成员变量是相互独立的.要想共用数据,则需要使用静态成员和静态方法. 只要在类中声明静态成员变量,即使不定义对象,也可以为静态成员变量分配空间,进 ...
- django drf安装和doc生成
1.打开drf官网https://www.django-rest-framework.org/,把相关的包pip install 2.INSTALLED_APPS添加drf 3.url配置 4.tes ...
- JAVA程序对MYSQL数据库加锁实验
什么是脏读,不可重复读,幻读 1. 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据. 2. 不可重 ...
- ERWin7.2在Windows 8.1中生成数据库遇到的问题!
我在Windows 8.1中使用ERWin7.2,想象以前在windows 7 或者XP里那样先预览一下要生成的SQL语句,结果我发现居然没有“preview”按钮了,自然也就无法看到要生成的SQL语 ...
- Hbase的安装与测试
实验环境 虚拟机伪分布式 Ubuntu 17.10 JDK 1.8 Hadoop 2.7.6 Hbase 1.3.3 ①安装和配置HBase. 首先从官网http://archive.apache.o ...
- while 小项目练习
# (1) 用双层while 写十行十列小星星 j = 0 while j < 10: #打印一行十个小星星 i = 0 while i <10: print("*", ...
- 点击隐藏显示和点击body空白处隐藏
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- “全栈2019”Java第十七章:赋值运算符和算术运算符
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- fread和fwrite用法小结
fwrite和fread是以记录为单位的I/O函数,fread和fwrite函数一般用于二进制文件的输入输出. #include <stdio.h>size_t fread(void *p ...
- 【bzoj4888】: [Tjoi2017]异或和 BIT-乱搞
[bzoj4888]: [Tjoi2017]异或和 题目大意:给定一个序列,求这个序列所有的连续和的异或值.(n<=1e5 ai<=1e6) 想了各种奇怪的方法就是不会做啊啊啊.. Orz ...