QwQzcysky真是菜死了,这是我刚上高一的时候坤爷在夏令营讲的,可是今天才切掉……

想想也神奇,一个2016.11才学会线段树的菜鸡,夏令营的时候居然听过Segment-Tree-Beats?

所以我们来看下这个神奇的Segment-Tree-Beats.

我们维护一个神奇的标记二元组(x,y),在树点上打这个标记表示$val[o]=max(val[o]+x,y)$

然后我们看一下它是不是可以合并(否则这就是一个没有的东西)

merge:merge(Tag[x],Tag[y])=(x1+x2,max(y1+x2,y2))

那么我们怎么把操作对应到标记修改上呢?

  • opt1:(x,0)
  • opt2:(-x,0)
  • opt3:(-inf,x)

query的时候查询标记,正常pushdown就行了。

所以再维护一下历史最大值,这个对于做过一些简单的Segment-Tree-Beats的同学来说简直是简单的不行。

不过每次修改的时候有一个小细节,(x,y)的x最好是max(x,-inf),否则会出事。

#include<bits/stdc++.h>
#define N 500010
#define lson (o<<1)
#define rson (o<<1|1)
using namespace std;
typedef long long ll;
const ll inf=1e18;
int n,m;
struct Tag{
ll x,y,tx,ty;
Tag(ll x=,ll y=,ll tx=,ll ty=):x(x),y(y),tx(tx),ty(ty){}
};
ll a[N];
struct Segment_Tree_Beats{
ll val[N<<];Tag tag[N<<];
inline Tag merge(Tag a,Tag b){
return Tag(max(a.x+b.x,-inf),max(a.y+b.x,b.y),max(a.tx,a.x+b.tx),max(a.ty,max(a.y+b.tx,b.ty)));
}
inline void pushdown(int o,int l,int r){
if(l==r)return;
tag[lson]=merge(tag[lson],tag[o]);
tag[rson]=merge(tag[rson],tag[o]);
tag[o]=Tag(,,,);
}
void build(int o,int l,int r){
tag[o]=Tag(,,,);
if(l==r)return;int mid=(l+r)>>;
build(lson,l,mid);build(rson,mid+,r);
}
void change(int o,int l,int r,int ql,int qr,Tag v){
if(ql<=l&&r<=qr){tag[o]=merge(tag[o],v);return;}
int mid=(l+r)>>;pushdown(o,l,r);
if(ql<=mid)change(lson,l,mid,ql,qr,v);
if(qr>mid)change(rson,mid+,r,ql,qr,v);
}
Tag query(int o,int l,int r,int q){
if(l==r)return tag[o];
int mid=(l+r)>>;pushdown(o,l,r);
if(q<=mid)return query(lson,l,mid,q);
else return query(rson,mid+,r,q);
}
}T;
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();m=read();
for(int i=;i<=n;i++)a[i]=read();
T.build(,,n);
while(m--){
Tag ans;int opt=read();
if(opt==){
int l=read(),r=read(),x=read();
T.change(,,n,l,r,Tag(x,-inf,x,-inf));
}
if(opt==){
int l=read(),r=read(),x=read();
T.change(,,n,l,r,Tag(-x,,-x,));
}
if(opt==){
int l=read(),r=read(),x=read();
T.change(,,n,l,r,Tag(-inf,x,-inf,x));
}
if(opt==){
int x=read();ans=T.query(,,n,x);
printf("%lld\n",max(a[x]+ans.x,ans.y));
}
if(opt==){
int x=read();ans=T.query(,,n,x);
printf("%lld\n",max(a[x]+ans.tx,ans.ty));
}
}
}

【UOJ#164】清华集训2015V的更多相关文章

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

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

  2. [UOJ#274][清华集训2016]温暖会指引我们前行

    [UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...

  3. BZOJ 4732 UOJ #268 [清华集训2016]数据交互 (树链剖分、线段树)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4732 (UOJ) http://uoj.ac/problem/268 题解 ...

  4. uoj #46[清华集训2014]玄学

    uoj 因为询问是关于一段连续区间内的操作的,所以对操作构建线段树,这里每个点维护若干个不交的区间,每个区间\((l,r,a,b)\)表示区间\([l,r]\)内的数要变成\(ax+b\) 每次把新操 ...

  5. [UOJ#276][清华集训2016]汽水[分数规划+点分治]

    题意 给定一棵 \(n\) 个点的树,给定 \(k\) ,求 \(|\frac{\sum w(路径长度)}{t(路径边数)}-k|\)的最小值. \(n\leq 5\times 10^5,k\leq ...

  6. UOJ.41.[清华集训2014]矩阵变换(稳定婚姻)

    题目链接 稳定婚姻问题:有n个男生n个女生,每个男/女生对每个女/男生有一个不同的喜爱程度.给每个人选择配偶. 若不存在 x,y未匹配,且x喜欢y胜过喜欢x当前的配偶,y喜欢x也胜过y当前的配偶 的完 ...

  7. bzoj 3816&&uoj #41. [清华集训2014]矩阵变换

    稳定婚姻问题: 有n个男生,n个女生,所有女生在每个男生眼里有个排名,反之一样. 将男生和女生两两配对,保证不会出现婚姻不稳定的问题. 即A-1,B-2 而A更喜欢2,2更喜欢A. 算法流程: 每次男 ...

  8. UOJ #164. 【清华集训2015】V | 线段树

    题目链接 UOJ #164 题解 首先,这道题有三种询问:区间加.区间减(减完对\(0\)取\(\max\)).区间修改. 可以用一种标记来表示--标记\((a, b)\)表示把原来的值加上\(a\) ...

  9. UOJ 275. 【清华集训2016】组合数问题

    UOJ 275. [清华集训2016]组合数问题 组合数 $C_n^m $表示的是从 \(n\) 个物品中选出 \(m\) 个物品的方案数.举个例子,从$ (1,2,3)(1,2,3)$ 三个物品中选 ...

随机推荐

  1. 虚拟机如何设置U盘启动项

    开始配置虚拟机时选"自定义"不要选"典型",在“SCSI设配器”选LSI logic ,(不是默认的那个):然后其他正常默认创建,虚拟机建好后,再添加U盘为虚拟 ...

  2. BZOJ3329:Xorequ——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3329 原式化为x^2x=3x,而且实际上异或就是不进位的加法. 那么我们又有x+2x=3x,所以在做 ...

  3. BZOJ 1342: [Baltic2007]Sound静音问题 | 单调队列维护的好题

    题目: 给n个数字,一段合法区间[l,l+m-1]要求max-min<=c 输出所有合法区间的左端点,如果没有输出NONE 题解: 单调队列同时维护最大值和最小值 #include<cst ...

  4. BZOJ2795/2890/3647 [Poi2012]A Horrible Poem 【字符串hash】

    题目链接 BZOJ2795 BZOJ2890 BZOJ3647 题解 三倍经验! 我们要快速求区间最小循环节 我们知道循环节有如下性质: ①当\(L\)为循环节长度,那么\(s[l...r - L] ...

  5. BZOJ2597 [Wc2007]剪刀石头布 【费用流】

    题目链接 BZOJ2597 题解 orz思维差 既然是一张竞赛图,我们选出任意三个点都可能成环 总方案数为 \[{n \choose 3}\] 如果三个点不成环,会发现它们的度数是确定的,入度分别为\ ...

  6. HDOJ.2084 数塔(DP)

    数塔 点我挑战题目 题意分析 DP的思想,自上而下计算. [这几天比较忙 有空补上] 代码总览 /* Title:HDOJ.2084 Author:pengwill Date:2017-1-14 */ ...

  7. SRM16 B-2(DP)

    老鼠和洞按坐标排序 f[i][j]表示前i个洞进j只老鼠的最短距离 比赛的时候强行分三类去推式子,推是推出来了,也看出来是可以用三个单调队列去优化的,但是太繁琐了,要我敲我真没办法T^T 赛后经 on ...

  8. Ubuntu 16.04安装NVIDIA驱动后循环登录问题

    问题描述 最近买了两块NVIDIA Titan X Pascal显卡装到了服务器(运行Ubuntu 16.04)上.为了使用这两块GPU显卡,首先需要安装显卡驱动,安装方式为 #安装一个依赖文件,并更 ...

  9. ASP.Net初级学习一(基本语句入门)

    <body > <form method="post" action="program.ashx"> <input type=&q ...

  10. HDU3265 线段树(扫描线)

    Posters Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...