题目:http://uoj.ac/problem/164

把操作改成形如 ( a,b ) 表示加上 a 之后对 b 取 max 的意思。

每个点维护当前的 a , b ,还有历史最大的 a , b 即 ma , mb 。

因为最后的答案是 tp[ x ] + ma , mb 中的一个,所以这样维护。之所以不直接维护 max{ tp[ x ]+ma , mb } ,是为了方便转移。

转移 a , b 的时候就是 \( max{max{x+a,b}+a',b'} <=> max{x+a+a',max{b+a',b'}} \) 。

转移 ma , mb 的时候,理解一下,就是 \( ma=max{ma,a+ma'} , mb=max{mb,max{mb',b+ma'}} \)

好像可以这样理解?https://blog.csdn.net/qq_39972971/article/details/79147791

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define ls Ls[cr]
#define rs Rs[cr]
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
ll Mx(ll a,ll b){return a>b?a:b;}
ll Mn(ll a,ll b){return a<b?a:b;}
const int N=5e5+,M=N<<; const ll INF=5e14+;
void upd(ll &x){x=Mx(x,-INF);x=Mn(x,INF);return;} int n,m,tp[N],tot,Ls[M],Rs[M];
ll a[M],b[M],ma[M],mb[M];
void build(int l,int r,int cr)
{
b[cr]=mb[cr]=-INF;
if(l==r){b[cr]=mb[cr]=tp[l];return;}
int mid=l+r>>;
ls=++tot; build(l,mid,ls);
rs=++tot; build(mid+,r,rs);
}
void cz(int u,int v)
{
mb[v]=Mx(mb[v],Mx(b[v]+ma[u],mb[u]));//b[v]+ma[u] not mb[v]+ma[u]
ma[v]=Mx(ma[v],a[v]+ma[u]);//a[v]+ma[u] not ma[v]+ma[u]
b[v]=Mx(b[v]+a[u],b[u]);
a[v]=Mx(a[v]+a[u],-INF);//only here
}
void pshd(int cr)
{
if(ls)cz(cr,ls); if(rs)cz(cr,rs);
a[cr]=ma[cr]=; b[cr]=mb[cr]=-INF;
}
void mdfy(int l,int r,int cr,int L,int R)
{
if(l>=L&&r<=R){cz(,cr); return;}
int mid=l+r>>; pshd(cr);
if(L<=mid)mdfy(l,mid,ls,L,R);
if(mid<R)mdfy(mid+,r,rs,L,R);
}
int qry(int l,int r,int cr,int p)
{
if(l==r)return cr;int mid=l+r>>;
pshd(cr);
if(p<=mid)return qry(l,mid,ls,p);
else return qry(mid+,r,rs,p);
}
int main()
{
n=rdn();m=rdn();
for(int i=;i<=n;i++)tp[i]=rdn();
tot=;build(,n,);
for(int i=,op,l,r,x;i<=m;i++)
{
op=rdn();
if(op<=)
{
l=rdn();r=rdn();x=rdn();
if(op==)a[]=ma[]=x,b[]=mb[]=-INF;
if(op==)a[]=ma[]=-x,b[]=mb[]=;
if(op==)a[]=ma[]=-INF,b[]=mb[]=x;
mdfy(,n,,l,r);
}
else
{
x=rdn(); int cr=qry(,n,,x);
if(op==)printf("%lld\n",Mx(tp[x]+a[cr],b[cr]));
if(op==)printf("%lld\n",Mx(tp[x]+ma[cr],mb[cr]));
}
}
return ;
}

LOJ 164 【清华集训2015】V——线段树维护历史最值的更多相关文章

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

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

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

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

  3. 【bzoj3064】Tyvj 1518 CPU监控 线段树维护历史最值

    题目描述 给你一个序列,支持4种操作:1.查询区间最大值:2.查询区间历史最大值:3.区间加:4.区间赋值. 输入 第一行一个正整数T,表示Bob需要监视CPU的总时间. 然后第二行给出T个数表示在你 ...

  4. SPOJ 1557 GSS2 - Can you answer these queries II (线段树+维护历史最值)

    都说这题是 GSS 系列中最难的,今天做了一下,名副其实 首先你可以想到各种各样的在线乱搞想法,线段树,主席树,平衡树,等等,但发现都不太可行. 注意到题目也没有说强制在线,因此可以想到离线地去解决这 ...

  5. 【题解】P4247 [清华集训]序列操作(线段树修改DP)

    [题解]P4247 [清华集训]序列操作(线段树修改DP) 一道神仙数据结构(DP)题. 题目大意 给定你一个序列,会区间加和区间变相反数,要你支持查询一段区间内任意选择\(c\)个数乘起来的和.对1 ...

  6. 滑动窗口(poj,线段树维护区间最值)

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

  7. CF213E Two Permutations 线段树维护哈希值

    当初竟然看成子串了$qwq$,不过老师的$ppt$也错了$qwq$ 由于子序列一定是的排列,所以考虑插入$1$到$m$到$n-m+1$到$n$; 如何判断呢?可以用哈希$qwq$: 我们用线段树维护哈 ...

  8. 清华集训2015 V

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

  9. [CSP-S模拟测试]:椎(线段树维护区间最值和单调栈)

    题目描述 虽不能至,心向往之. $Treap=Tree+Heap$ 椎$=$树$+$堆 小$\pi$学习了计算机科学中的数据结构$Treap$. 小$\pi$知道$Treap$指的是一种树. 小$\p ...

随机推荐

  1. 阿里云ECS服务器自定义端口无法访问问题记录

    记住阿里云ECS服务器有个安全组!!! 购买了阿里云服务器的时候,购买界面那里是可以勾选默认的几个端口是否开启的,服务器默认勾了22端口,使用户能登录服务器. 当我们在服务器里面配置nginx,开启自 ...

  2. Deep Belief Network简介——本质上是在做逐层无监督学习,每次学习一层网络结构再逐步加深网络

    from:http://www.cnblogs.com/kemaswill/p/3266026.html 1. 多层神经网络存在的问题 常用的神经网络模型, 一般只包含输入层, 输出层和一个隐藏层: ...

  3. 013PHP文件处理——filemtime filectime fileatime date_default_timezone_set touch

    <?php /** * filemtime filectime fileatime date_default_timezone_set touch */ /*filemtime:获取文件的修改时 ...

  4. 1.strcpy使用注意

    void test1() { char string[10]; char *str1 ="0123456789"; strcpy(string,str1); } 上述代码问题? 字 ...

  5. scrapy-redis(七):部署scrapy

    一般我们写好scrapy爬虫,如果需要启动的话,需要进入scrapy项目的根目录,然后运行以下命令: scrapy crawl {spidername} 这样我们就可以在终端查看到爬虫信息了.但爬虫运 ...

  6. Python的generator生成器

    generator保存的是算法,元素仅在使用的时候生成,占用内存小,总元素的个数可以是无限个. 简单的生成器与列表生成式,区别仅在于将中括号[ ],换成小圆括号( ). In [1]: g=(x*x+ ...

  7. Final阶段第1周/共1周 Scrum立会报告+燃尽图 01

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2411] 版本控制:https://git.coding.net/liuyy08 ...

  8. anu - children

    import { _flattenChildren } from "./createElement"; export const Children = { only(childre ...

  9. Alpha阶段敏捷冲刺---Day4

    一.Daily Scrum Meeting照片 二.今天冲刺情况反馈 今天我们上完课后在禹洲楼教室外进行我们的每日立会.开会的内容主要是对昨天遇到的困难做了一些交流,并且定下今天的任务是完成排行榜界面 ...

  10. 手动开启ARC

    手动开启某些文件的ARC,在Compiler Flags一列加上-fobjc-arc就表示开启这个.m文件的ARC 禁止某些文件的ARC,在Compiler Flags一列加上-fno-objc-ar ...