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 线段树维护历史最值,思想大致是维护标记出现过的最大值 考虑这种 ...
随机推荐
- VS2015 与 Git 的简单使用
前言 在白忙之中抽了点时间,记录了下 VS 与 Git 的简单使用. 在之前使用命令行的时候,提交或拉取代码时,总报错:(提取时遇到错误: Unsupported URL protocol),后来在网 ...
- MIPS架构上函数调用过程的堆栈和栈帧
转载于CSDN:http://blog.csdn.net/do2jiang/article/details/5404566 在计算机科学中,Call stack是指存放某个程序的正在运行的函数的信息的 ...
- Java——分页 Servlet + Jsp+Jdbc 有点瑕疵
1.创建数据库,插入多条数据 2.java连接DB 3.Person类: package com.phome.po; public class Person { private int id; pri ...
- Oracle——存储过程的使用
为什么使用存储过程? 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度. 存储过程的定义: 存储过程(Sto ...
- VSS2005源代码管理
VSS2005使用详细 http://www.docin.com/p-467455948.html 花了差不多一天的时间把vss配置搞明白了~废话不多说,下面简单的介绍下配置的过程:安装VSS2005 ...
- 单行纯文本框QLineEdit
继承 QWidget 天子骄龙
- Linux常用命令(一)查看日志
当日志文件存储很大时,需要Linux命令查看: Log 在目录 /var/log/ 下 常用命令: tail head grep sed cat tac https://blog.csdn.net ...
- saltstack系列~第二篇
一 简介:今天咱们来继续学习saltstack 二 命名和分组 1 命名规则 1 ID构成 机房-DB类型-角色(主/从)-IP地址 2 分组构成 分为master slave两组即可 2 分组规则 ...
- 3d图像识别基础论文:pointNet阅读笔记
PointNet 论文阅读: 主要思路:输入独立的点云数据,进行变换不变性处理(T-net)后,通过pointNet网络训练后,最后通过最大池化和softMax分类器,输出评分结果. 摘要: 相较于之 ...
- 重装系统,出现:Units specified don't exist SHSUCDX can't install
重装系统,出现:Units specified don't exist SHSUCDX can't install 解决方案1: 首先是你的硬盘分区不对吧 先用PQ格成ntfs或far32 进PE把C ...