BZOJ4355:Play with sequence——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4355
维护一个长度为N的序列a,现在有三种操作:1)给出参数U,V,C,将a[U],a[U+1],...,a[V-1],a[V]都赋值为C。2)给出参数U,V,C,对于区间[U,V]里的每个数i,将a[i]赋值为max(a[i]+C,0)。3)给出参数U,V,输出a[U],a[U+1],...,a[V-1],a[V]里值为0的数字个数。
吉如一论文板子题(当然所有的操作都来自论文拼起来的那当然是板子了。)
(本题解适合知道基本的吉司机线段树操作的人看。)
1操作根据玄学势能分析如果当前区间数都相等的话就可以转换成加操作,如果不相等会变成相等。
所以我们只要暴力做1操作(连lazy标记都不用打)即可。
2操作拆成两个操作,一次是区间+c,一次是区间a[i]=max(a[i],0)。
3操作实际就是问当前区间最小值为0时最小值个数。
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll INF=5e18;
const int N=3e5+;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
int n,m,b[N],cnt[N*];
ll mn[N*],se[N*],lzmn[N*],lzad[N*];
inline void upt(int a){
int ls=a<<,rs=a<<|;
if(mn[ls]==mn[rs]){
mn[a]=mn[ls];se[a]=min(se[ls],se[rs]);
cnt[a]=cnt[ls]+cnt[rs];
}
else if(mn[ls]<mn[rs]){
mn[a]=mn[ls];se[a]=min(se[ls],mn[rs]);
cnt[a]=cnt[ls];
}else{
mn[a]=mn[rs];se[a]=min(se[rs],mn[ls]);
cnt[a]=cnt[rs];
}
}
inline void pushadd(int a,ll x){
mn[a]+=x;lzad[a]+=x;
if(lzmn[a]!=-INF)lzmn[a]+=x;
if(se[a]!=INF)se[a]+=x;
}
inline void push(int a){
int ls=a<<,rs=a<<|;
if(lzad[a]){
pushadd(ls,lzad[a]);
pushadd(rs,lzad[a]);
lzad[a]=;
}
if(lzmn[a]!=-INF){
if(mn[ls]<lzmn[a]){
mn[ls]=lzmn[a];lzmn[ls]=lzmn[a];
}
if(mn[rs]<lzmn[a]){
mn[rs]=lzmn[a];lzmn[rs]=lzmn[a];
}
lzmn[a]=-INF;
}
}
void build(int a,int l,int r){
lzmn[a]=-INF;lzad[a]=;
if(l==r){
mn[a]=b[l];se[a]=INF;cnt[a]=;
return;
}
int mid=(l+r)>>;
build(a<<,l,mid);build(a<<|,mid+,r);
upt(a);
}
void add(int a,int l,int r,int l1,int r1,int x){
if(r<l1||r1<l||(se[a]==INF&&mn[a]==&&x<=))return;
if(l1<=l&&r<=r1){
if(mn[a]+x>=){
pushadd(a,x);
return;
}
else if(se[a]==INF||se[a]+x>){
pushadd(a,x);
mn[a]=;lzmn[a]=;
return;
}
}
int mid=(l+r)>>;
push(a);
add(a<<,l,mid,l1,r1,x);add(a<<|,mid+,r,l1,r1,x);
upt(a);
}
void cover(int a,int l,int r,int l1,int r1,int x){
if(r<l1||r1<l)return;
if(l1<=l&&r<=r1&&se[a]==INF){
pushadd(a,(ll)x-mn[a]);
return;
}
int mid=(l+r)>>;
push(a);
cover(a<<,l,mid,l1,r1,x);cover(a<<|,mid+,r,l1,r1,x);
upt(a);
}
int qry(int a,int l,int r,int l1,int r1){
if(r<l1||r1<l)return ;
if(l1<=l&&r<=r1){
if(!mn[a])return cnt[a];
return ;
}
int mid=(l+r)>>;
push(a);
return qry(a<<,l,mid,l1,r1)+qry(a<<|,mid+,r,l1,r1);
}
int main(){
n=read(),m=read();
for(int i=;i<=n;i++)b[i]=read();
build(,,n);
while(m--){
int op=read(),x=read(),y=read();
if(op==)cover(,,n,x,y,read());
if(op==)add(,,n,x,y,read());
if(op==)printf("%d\n",qry(,,n,x,y));
}
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
BZOJ4355:Play with sequence——题解的更多相关文章
- 【CF486E】LIS of Sequence题解
[CF486E]LIS of Sequence题解 题目链接 题意: 给你一个长度为n的序列a1,a2,...,an,你需要把这n个元素分成三类:1,2,3: 1:所有的最长上升子序列都不包含这个元素 ...
- BZOJ4355: Play with sequence
BZOJ4355: Play with sequence https://lydsy.com/JudgeOnline/problem.php?id=4355 分析: 模板题. 把\(2\)操作看成先区 ...
- bzoj4355 Play with sequence(吉司机线段树)题解
题意: 已知\(n\)个数字,进行以下操作: \(1.\)区间\([L,R]\) 赋值为\(x\) \(2.\)区间\([L,R]\) 赋值为\(max(a[i] + x, 0)\) \(3.\)区间 ...
- CF3D Least Cost Bracket Sequence 题解
题目 This is yet another problem on regular bracket sequences. A bracket sequence is called regular, i ...
- POJ3581:Sequence——题解
http://poj.org/problem?id=3581 给一串数,将其分成三个区间并且颠倒这三个区间,使得新数列字典序最小. 参考:http://blog.csdn.net/libin56842 ...
- Pop Sequence 题解
Pop Sequence(PAT) https://www.nowcoder.com/pat/5/problem/4090 前言: PAT上一道Stack的应用题,简化版的有<信息学一本通·普及 ...
- CF524F And Yet Another Bracket Sequence 题解
题目链接 算法:后缀数组+ST表+贪心 各路题解都没怎么看懂,只会常数巨大的后缀数组+ST表,最大点用时 \(4s\), 刚好可以过... 确定合法序列长度 首先一个括号序列是合法的必须满足以 ...
- Codeforces 486E LIS of Sequence 题解
题目大意: 一个序列,问其中每一个元素是否为所有最长上升子序列中的元素或是几个但不是所有最长上升子序列中的元素或一个最长上升子序列都不是. 思路: 求以每一个元素为开头和结尾的最长上升子序列长度,若两 ...
- TopCoder SRM 625 Incrementing Sequence 题解
本题就是给出一个数k和一个数组,包含N个元素,通过每次添加�数组中的一个数的操作,最后须要得到1 - N的一个序列,不用排序. 能够从暴力法入手,然后优化. 这里利用hash表进行优化,终于得到时间效 ...
随机推荐
- 阿里云中linux 下svn服务器安装
摘要: 安装步骤如下: 1.yum install subversion 2.输入rpm -ql subversion查看安装位置,如下图: 我们知道svn在bin目录下生成了几个二进制文件. 输 ...
- Qt-QML-Button-ButtonStyle-实现鼠标滑过点击效果
上次实现的自定义的Button功能是用的自定义的Rectangle来实现的,在慢慢的接触了QML之后,发现QML有自己定义的Button 这里盗版贴上Qt帮助文档中的部分关于Button的属性内容 B ...
- 180602-nginx多域名配置
文章链接:https://liuyueyi.github.io/hexblog/2018/06/02/180602-nginx多域名配置/ nginx多域名配置 原来的域名过期了,重新买了一个hhui ...
- 180601-MySql性能监控工具MyTop
文章链接:https://blog.hhui.top/hexblog/2018/06/01/180601-MySql性能监控工具MyTop/ mysql 性能监控小工具之 mytop 参考: How ...
- mysql5.6 无法远程连接问题解决
需要配置mysql5.6版本的my.cnf文件,我的my.cnf文件配置如下: port=3306是我后来自己加上的.加上这个之后重启mysql service mysqld restart 记得给r ...
- Angualr6访问API
参照 草根专栏- ASP.NET Core + Ng6 实战: https://v.qq.com/x/page/a0769armuui.html 1.environment.ts 添加apiUrlBa ...
- Vuejs 基础与语法
Vue 实例 创建第一个实例 {{}} 被称之为插值表达式.可以用来进行文本插值. <!DOCTYPE html> <html lang="en"> < ...
- win32绘制自定义类窗口导致绘制11个窗口的解决办法
上网查了一圈也没有找到解决问题的办法,一旦创建了一个窗口,并且在过程函数中绘制窗口,尤其是一些非子窗口的自定义类窗口,都会生成11个窗口(算上主窗口就是12个),但是使用系统通用控件就不会有这种情况的 ...
- 最短路径算法(II)
什么??你问我为什么不在一篇文章写完所有方法?? Hmm…其实我是想的,但是博皮的加载速度再带上文章超长图片超多的话… 可能这辈子都打不开了吧… 上接https://www.cnblogs.com/U ...
- LiveVideoStack Meet|深圳 多媒体开发新趋势
2018年初始,音视频技术生态并不平静,Codec争夺愈加激烈,新一代标准的挑战一浪高过一浪:WebRTC的定版也为打通浏览器.移动端乃至IoT带来了机会:此外AI.区块链技术的兴起,催化着与多媒体领 ...