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监控 学习一番线段树的历史标记- 这道题就是区间加法,区间赋值,要询问区间最大值 和 区间历史最大值的最大值. 然后这种题就是在现有标记的基础上多弄一套标记,维护这个点出现过的最大的标 ...
随机推荐
- 网络1711班 C语言第一次作业批改总结
Testing 总结 1 本次作业评分规则 1.1 基本要求(1分) 按时交 - 有分 未交 - 0分 迟交一周以上 - 倒扣本次作业分数 抄袭 - 0分 博客作业格式不规范,没有用Markdown语 ...
- 实验四 Android程序设计 实验报告
实验四 Android程序设计 实验报告 目录 代码托管地址 Android程序设计-1 Android程序设计-2 Android程序设计-3 Android程序设计-4 Android程序设计-5 ...
- C语言最后一次博客作业
1.当初你是如何做出选择计算机专业的决定的? 一开始选专业的时候,说实话我很纠结也很迷茫,对我来说,中学时代,似乎就只要考好试,做好题就可以了,对于未来想要做啥并没有那么多的规划和想法,偶尔跟基友畅聊 ...
- C语言--第14.15周作业
一. 7-3 将数组中的数逆序存放 1.代码 #include 2<stdio.h> int main() { int a[10]; int i, n, s; scanf("%d ...
- io多路复用(二)
服务端 import socket sk1 = socket.socket() sk1.bind(('127.0.0.1',8001,)) sk1.listen() inputs = [sk1,] i ...
- 小草手把手教你 LabVIEW 串口仪器控制——VISA 串口配置
建议大家按我发帖子的顺序来看,方便大家理解.请不要跳跃式的阅读.很多人现在看书,都跳跃式的看,选择性的看,导致有些细节的部分没有掌握到,然后又因为某个细节耽误很多时间.以上只是个人建议,高手可以略过本 ...
- 【learning】多项式相关(求逆、开根、除法、取模)
(首先要%miskcoo,这位dalao写的博客(这里)实在是太强啦qwq大部分多项式相关的知识都是从这位dalao博客里面学的,下面这篇东西是自己对其博客学习后的一些总结和想法,大部分是按照其博客里 ...
- 算法题丨4Sum
描述 Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = ...
- PL/SQL Developer 导入导出操作
一.PL/SQL Developer数据导入 Tools->Import Tables
- html标记语言 --超链接
html标记语言 --超链接 四.超链接 1. 基本语法 <a href="" target="打开方式" name="页面锚点名称" ...