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. Python logging(日志)模块

    python日志模块 内容简介 1.日志相关概念 2.logging模块简介 3.logging模块函数使用 4.logging模块日志流处理流程 5.logging模块组件使用 6.logging配 ...

  2. NVIDIA TensorRT 让您的人工智能更快!

    NVIDIA TensorRT 让您的人工智能更快! 英伟达TensorRT™是一种高性能深度学习推理优化器和运行时提供低延迟和高通量的深度学习推理的应用程序.使用TensorRT,您可以优化神经网络 ...

  3. HDU4812 D tree 【点分治 + 乘法逆元】

    D树 时间限制:10000/5000 MS(Java / Others)内存限制:102400/102400 K(Java / Others) 总共提交5400个已接受的提交1144 问题描述 南京理 ...

  4. 直通BAT面试算法精讲课2

    对于一个int数组,请编写一个冒泡排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] clas ...

  5. 《python核心编程》--读书笔记 第21章 数据库编程

    准备:今天拿笔记本装了mysql,这样就能在不同地方用其他电脑远程访问同一个数据库了. python安装MySQLdb模块:http://www.codegood.com/downloads. 21. ...

  6. std::string::find() 和 std::string::npos

    npos是一个常数,用来表示不存在的位置,string::npos代表字符串到头了结束了.   int idx = str.find("abc");if (idx == strin ...

  7. mysql的concat用法

    问题提出:mybatis的mapper文件中的模糊查询: mysql CONCAT()函数用于将多个字符串连接成一个字符串,是最重要的mysql函数之一,下面就将为您详细介绍mysql CONCAT( ...

  8. HDU1255 扫描线 矩形交面积 离散化

    覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  9. 动态切换input的 disables 属性

    $("input[type='text']").each(function(){ if($(this).data('parent_id')){ var _each_this_par ...

  10. linux内核挂载文件系统的两种方式

    1.nfs方式(挂载的为文件夹) bootargs=root=/dev/nfs nfsroot=192.168.1.105:/mnt/rootfs/rootfs ip=192.168.1.88:192 ...