BZOJ3064 Tyvj 1518 CPU监控 线段树
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ3064
题意概括
一个序列,要你支持以下操作:
1. 区间询问最大值
2. 区间询问历史最大值
3. 区间加某一个值
4. 区间赋值
序列长度<=100000, 操作数<=100000
题解
http://blog.csdn.net/vmurder/article/details/43271091
为了一个傻逼错误找了2个小时的我,实在不想写题解了。请您看上面那个链接 的……
代码
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
typedef long long LL;
const int N=100005;
const int Inf=2147483647;
struct Tree{
int hMax,Max,hadd,add,hco,co;
}t[N*4];
int n,m,v[N];
void p(int &a,int b){
a=max(a,b);
}
void pushup(int rt){
int ls=rt<<1,rs=ls|1;
t[rt].Max=max(t[ls].Max,t[rs].Max);
p(t[rt].hMax,max(t[ls].hMax,t[rs].hMax));
}
void build(int rt,int L,int R){
t[rt].add=t[rt].hadd=0,t[rt].hco=t[rt].co=-Inf;
if (L==R){
t[rt].Max=t[rt].hMax=v[L];
return;
}
int mid=(L+R)>>1,ls=rt<<1,rs=ls|1;
build(ls,L,mid);
build(rs,mid+1,R);
pushup(rt);
}
void now_add(int rt,int v){
if (t[rt].co>-Inf)
p(t[rt].hco,t[rt].co+=v);
else
p(t[rt].hadd,t[rt].add+=v);
p(t[rt].hMax,t[rt].Max+=v);
}
void now_cover(int rt,int v){
p(t[rt].hMax,t[rt].Max=v);
p(t[rt].hco,t[rt].co=v);
t[rt].add=0;
}
void his_add(int rt,int v){
p(t[rt].hMax,t[rt].Max+v);
if (t[rt].co>-Inf)
p(t[rt].hco,t[rt].co+v);
else
p(t[rt].hadd,t[rt].add+v);
}
void his_cover(int rt,int v){
p(t[rt].hMax,v);
p(t[rt].hco,v);
}
void pushdown(int rt){
int ls=rt<<1,rs=ls|1;
int &add=t[rt].add,&hadd=t[rt].hadd,&co=t[rt].co,&hco=t[rt].hco;
if (hadd){
his_add(ls,hadd);
his_add(rs,hadd);
hadd=0;
}
if (hco>-Inf){
his_cover(ls,hco);
his_cover(rs,hco);
hco=-Inf;
}
if (add){
now_add(ls,add);
now_add(rs,add);
add=0;
}
if (co>-Inf){
now_cover(ls,co);
now_cover(rs,co);
co=-Inf;
}
}
void update(int rt,int le,int ri,int xle,int xri,int v,int op){
if (le>xri||ri<xle)
return;
if (xle<=le&&ri<=xri){
if (!op)
now_add(rt,v);
else
now_cover(rt,v);
return;
}
pushdown(rt);
int mid=(le+ri)>>1,ls=rt<<1,rs=ls|1;
update(ls,le,mid,xle,xri,v,op);
update(rs,mid+1,ri,xle,xri,v,op);
pushup(rt);
}
int query(int rt,int le,int ri,int xle,int xri,int op){
if (le>xri||ri<xle)
return -Inf;
if (xle<=le&&ri<=xri)
return op?t[rt].hMax:t[rt].Max;
pushdown(rt);
int mid=(le+ri)>>1,ls=rt<<1,rs=ls|1;
return max(query(ls,le,mid,xle,xri,op),query(rs,mid+1,ri,xle,xri,op));
}
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&v[i]);
build(1,1,n);
scanf("%d",&m);
for (int i=1;i<=m;i++){
char op[5];
int x,y,z;
scanf("%s",op);
if (op[0]=='Q'){
scanf("%d%d",&x,&y);
printf("%d\n",query(1,1,n,x,y,0));
}
if (op[0]=='A'){
scanf("%d%d",&x,&y);
printf("%d\n",query(1,1,n,x,y,1));
}
if (op[0]=='P'){
scanf("%d%d%d",&x,&y,&z);
update(1,1,n,x,y,z,0);
}
if (op[0]=='C'){
scanf("%d%d%d",&x,&y,&z);
update(1,1,n,x,y,z,1);
}
}
return 0;
}
BZOJ3064 Tyvj 1518 CPU监控 线段树的更多相关文章
- 【bzoj3064】Tyvj 1518 CPU监控 线段树维护历史最值
题目描述 给你一个序列,支持4种操作:1.查询区间最大值:2.查询区间历史最大值:3.区间加:4.区间赋值. 输入 第一行一个正整数T,表示Bob需要监视CPU的总时间. 然后第二行给出T个数表示在你 ...
- 2018.07.27 bzoj3064: Tyvj 1518 CPU监控(线段树)
传送门 线段树好题. 维护区间加,区间覆盖,区间最大,区间历史最大. 这个东西在国家集训队2016论文集之<区间最值操作与历史最值问题--杭州学军中学 吉如一>中讲的已经很详细了. 简单来 ...
- bzoj3064 Tyvj 1518 CPU监控
Description Bob需要一个程序来监视CPU使用率.这是一个很繁琐的过程,为了让问题更加简单,Bob会慢慢列出今天会在用计算机时做什么事. Bob会干很多事,除了跑暴力程序看视频之外,还会做 ...
- [补档][Tyvj 1518]CPU监控
[Tyvj 1518]CPU监控 题目 Bob需要一个程序来监视CPU使用率.这是一个很繁琐的过程,为了让问题更加简单,Bob会慢慢列出今天会在用计算机时做什么事. Bob会干很多事,除了跑暴力程序看 ...
- Tyvj 1518 CPU监控(线段树)
题目描述: Bob需要一个程序来监视CPU使用率.这是一个很繁琐的过程,为了让问题更加简单,Bob会慢慢列出今天会在用计算机时做什么事. Bob会干很多事,除了跑暴力程序看视频之外,还会做出去玩玩和用 ...
- Tyvj 1518 CPU监控——极恶线段树
题目大意: 给定一个区间及其各个元素的初值,要求支持如下操作: 1.区间加 2.区间赋值 3.查询区间最大值 4.查询区间历史最大值 分析: 容易想到线段树,但是细思恶极(仔细想想恶心到了极点)的是, ...
- CPU监控 线段树裸题
LINK:bzoj3064 此题甚好码了20min停下来思考的时候才发现不对的地方有点坑... 还真不好写来着 可这的确是线段树的裸题...我觉得我写应该没有什么大问题 不过思路非常的紊乱 如果是自己 ...
- BZOJ.3064.CPU监控(线段树 历史最值)
题目链接 \(Description\) 有一个长为n的序列Ai,要求支持查询[l,r]的最值.历史最值,区间加/重设 \(Solution\) 线段树,每个点再维护一个历史(从0到现在)最大值.历史 ...
- bzoj 3064: Tyvj 1518 CPU监控
Description 1.区间加 \(z\) 2.区间覆盖为 \(z\) 3.查询区间最大值 4.查询区间历史最大值 Solution 线段树维护历史最值,思想大致是维护标记出现过的最大值 考虑这种 ...
随机推荐
- This page is about building Firefox Desktop
This page is about building Firefox Desktop The Mozilla build system, like the rest of the Mozilla c ...
- VS中修改工程名的解决方案
VS中修改工程名的解决方案: 一.先修改工程名/解决方案名(在VS中修改即可)举例,原先的工程名为OldProject 想要改成NewProject1.找到工程/解决方案所在的文件夹(已工程名/解 ...
- DjangoAdmin自定义过滤器
class UserIDFilter(admin.SimpleListFilter): # 自定义用户查询过滤器 title = _('关联用户') parameter_name = 'user_id ...
- B - 低阶入门膜法 - D-query (查询区间内有多少不同的数)
题目链接:https://cn.vjudge.net/contest/284294#problem/B 题目大意:查询区间内有多少个不相同的数. 具体思路:主席树的做法,主席树的基础做法是查询区间第k ...
- Java InputStream 、 InputStreamReader和BufferedReader
https://blog.csdn.net/zgljl2012/article/details/47267609 在Java中,上述三个类经常用于处理数据流,下面介绍一下三个类的不同之处以及各自的用法 ...
- Modelsim SE 破解教程
第一步:打开我们提供的破解工具包. 第二步:拷贝crack.bat和MentorKG.exe到"C:\modeltech64_10.2c\win64"路径下,如果你的电脑为32位, ...
- Pytorch入门之VAE
关于自编码器的原理见另一篇博客 : 编码器AE & VAE 这里谈谈对于变分自编码器(Variational auto-encoder)即VAE的实现. 1. 稀疏编码 首先介绍一下“稀疏编码 ...
- ARMV8 datasheet学习笔记2:概述
1. 前言 本文主要概括的介绍ARMV8体系结构定义了哪些内容,概括的说: ARM体系结构定义了PE的行为,不会定义具体的实现 ARM体系结构也定义了debug体系结构和trace体系结构 ARM体系 ...
- 网络常用的linux系统调用
网络之常用的Linux系统调用 下面一些函数已经过时,被新的更好的函数所代替了(gcc在链接这些函数时会发出警告),但因为兼容的原因还保留着,这些函数将在前面标上“*”号以示区别. 一.进程控制 fo ...
- git操作之冲突解决
应用场景,任哥,我两个人共同修改了git项目上的一个文件.zsh命令行模式 准备工作 简写命令解释 gl=git pullgp=git pushgst=git statusgcmsg=git comm ...