坑爹题面:http://uoj.ac/problem/164

正常题面:

对于一个序列支持下列5个操作:

1.区间加x

2.区间减x并与0取max

3.区间覆盖

4.单点查询

5.单点历史最大值查询

题解:

每个区间维护一个标记函数f(x)=max(x+a,b)

那么两个标记 f 和 g 的合并就是g(f(x))=max(x+max(fa+ga,-inf),max(fb+ga,gb))(打f标记的时间在前,打g标记在后)

区间加减就是打上max(x,0),区间覆盖就是打上max(-inf,x)

只要记录历史最大标记即可维护历史最大值

code:

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long int64;
char ch;
bool ok;
void read(int &x){
for (ok=,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=;
for (x=;isdigit(ch);x=x*+ch-'',ch=getchar());
if (ok) x=-x;
}
const int maxn=;
const int64 inf=4557430888798830399LL;
int n,m,val[maxn],op,l,r,x;
typedef pair<int64,int64> PII;
#define a first
#define b second
PII operator+(const PII &x,const PII &y){return make_pair(max(x.a+y.a,-inf),max(x.b+y.a,y.b));}
PII max(const PII &x,const PII &y){return make_pair(max(x.a,y.a),max(x.b,y.b));}
struct Seg{
#define ls k<<1
#define rs (k<<1)+1
PII now[maxn<<],ever[maxn<<];
void build(int k,int l,int r){
if (l==r){now[k]=ever[k]=make_pair(val[l],);return;}
int m=(l+r)>>;
build(ls,l,m),build(rs,m+,r);
}
void pushdown(int k){
ever[ls]=max(ever[ls],now[ls]+ever[k]);
ever[rs]=max(ever[rs],now[rs]+ever[k]);
now[ls]=now[ls]+now[k],now[rs]=now[rs]+now[k];
now[k]=ever[k]=make_pair(,);
}
void modify(int k,int l,int r,int x,int y,PII v){
if (l==x&&r==y){now[k]=now[k]+v,ever[k]=max(ever[k],now[k]);return;}
int m=(l+r)>>; pushdown(k);
if (y<=m) modify(ls,l,m,x,y,v);
else if (x<=m) modify(ls,l,m,x,m,v),modify(rs,m+,r,m+,y,v);
else modify(rs,m+,r,x,y,v);
}
void add(int x,int y,int v){modify(,,n,x,y,make_pair(v,));}
void cov(int x,int y,int v){modify(,,n,x,y,make_pair(-inf,v));}
int64 query(int k,int l,int r,int x,int op){
if (l==r){
if (op) return max(ever[k].a,ever[k].b);
else return max(now[k].a,now[k].b);
}
int m=(l+r)>>; pushdown(k);
if (x<=m) return query(ls,l,m,x,op); else return query(rs,m+,r,x,op);
}
int64 query(int x,int op){return query(,,n,x,op);}
}T;
int main(){
read(n),read(m);
for (int i=;i<=n;i++) read(val[i]);
T.build(,,n);
for (int i=;i<=m;i++){
read(op);
if (op==) read(l),read(r),read(x),T.add(l,r,x);
else if (op==) read(l),read(r),read(x),T.add(l,r,-x);
else if (op==) read(l),read(r),read(x),T.cov(l,r,x);
else if (op==) read(x),printf("%lld\n",T.query(x,));
else read(x),printf("%lld\n",T.query(x,));
}
return ;
}

uoj164. 【清华集训2015】V 统计的更多相关文章

  1. 清华集训2015 V

    #164. [清华集训2015]V http://uoj.ac/problem/164 统计 描述 提交 自定义测试 Picks博士观察完金星凌日后,设计了一个复杂的电阻器.为了简化题目,题目中的常数 ...

  2. 【uoj#164】[清华集训2015]V 线段树维护历史最值

    题目描述 给你一个长度为 $n$ 的序列,支持五种操作: $1\ l\ r\ x$ :将 $[l,r]$ 内的数加上 $x$ :$2\ l\ r\ x$ :将 $[l,r]$ 内的数减去 $x$ ,并 ...

  3. UOJ #164 [清华集训2015]V (线段树)

    题目链接 http://uoj.ac/problem/164 题解 神仙线段树题. 首先赋值操作可以等价于减掉正无穷再加上\(x\). 假设某个位置从前到后的操作序列是: \(x_1,x_2,..., ...

  4. 「清华集训2015」V

    「清华集训2015」V 题目大意: 你有一个序列,你需要支持区间加一个数并对 \(0\) 取 \(\max\),区间赋值,查询单点的值以及单点历史最大值. 解题思路: 观察发现,每一种修改操作都可以用 ...

  5. 「题解」「UOJ-164」「清华集训2015」V

    目录 题目 原题目 简要题目 正解 这道题题目简洁新颖,吸引读者阅读兴趣... 题目 原题目 点这里 简要题目 需要你维护长度为n的序列并支持下列操作: 区间加法: 区间赋值: 区间每个 \(a_i\ ...

  6. LOJ 164 【清华集训2015】V——线段树维护历史最值

    题目:http://uoj.ac/problem/164 把操作改成形如 ( a,b ) 表示加上 a 之后对 b 取 max 的意思. 每个点维护当前的 a , b ,还有历史最大的 a , b 即 ...

  7. 2018.07.28 uoj#164. 【清华集训2015】V(线段树)

    传送门 线段树好题. 要求支持的操作: 1.区间变成max(xi−a,0)" role="presentation" style="position: rela ...

  8. UOJ #164 【清华集训2015】 V

    题目链接:V 这道题由于是单点询问,所以异常好写. 注意到每种修改操作都可以用一个标记\((a,b)\)表示.标记\((a,b)\)的意义就是\(x= \max\{x+a,b\}\) 同时这种标记也是 ...

  9. UOJ#164:【清华集训2015】V

    浅谈区间最值操作与历史最值问题:https://www.cnblogs.com/AKMer/p/10225100.html 题目传送门:http://uoj.ac/problem/164 论文题.论文 ...

随机推荐

  1. 在IDE中用Bing Code Search直接查找代码片段并且插入

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在IDE中用Bing Code Search直接查找代码片段并且插入.

  2. 色情不是我的所有——在法律边缘起舞的 FC2

    [核心提示] 世界上最大的色情站点之中的一个这项「殊荣」只是是 FC2 无心插柳被用户戴上的一顶帽子,这个从 1999 年成立至今已经超过 15 年历史的互联网活化石,远比你想象中更加高深莫測. 一个 ...

  3. [Webpack 2] Intro to the Production Webpack Course

    There are several lessons that will build on top of this project. It is a fairly standard, small web ...

  4. [PHP] csv to xml

    <?php error_reporting(E_ALL | E_STRICT); ini_set('display_errors', true); ini_set('auto_detect_li ...

  5. IO负载高的来源定位 IO系列

    http://elf8848.iteye.com/category/281637 前言: 在一般运维工作中经常会遇到这么一个场景,服务器的IO负载很高(iostat中的util),但是无法快速的定位到 ...

  6. Exploring Message Brokers: RabbitMQ, Kafka, ActiveMQ, and Kestrel--reference

    [This article was originally written by Yves Trudeau.] http://java.dzone.com/articles/exploring-mess ...

  7. RTB日志分析MR程序设计

    到新公司三个月了,上个月做的是Beacon项目,详细的设计思想还没有写文档.这两周开始搞Hadoop,开始阅读相关论文.开始编写MR程序.开始写java,大学时用java较多,工作后就一直在用c/c+ ...

  8. Android开发之使用广播监听网络状态变化

    我们经常需要判断网络状态的变化,如有无网络,所以需要监听网络状态的变化,比如网络断开,网络连接给予友好提示.如何监听网络状态的变化呢,最近工作中需要用到这个,于是就用广播机制来实现了网络状态的监听. ...

  9. [转载]js中__proto__和prototype的区别和关系

          首先,要明确几个点:1.在JS里,万物皆对象.方法(Function)是对象,方法的原型(Function.prototype)是对象.因此,它们都会具有对象共有的特点.即:对象具有属性_ ...

  10. C 函数指针数组

    名字有点绕口,其实更应该翻译为指针函数数组. 记录下对Head-First C这一节的理解,几乎每天班车上都会咪两眼,几乎每次都是看不懂,敲一敲的时候才有些明白. 通俗点讲,这功能解决的是,具有同种签 ...