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表进行优化,终于得到时间效 ...
随机推荐
- centos7下安装mysql8.0.12及设置权限
一.mysql版本介绍 mysql的官网为:https://www.mysql.com/ 在官网上可以看到多个版本,主要版本如下, 1.MySQL Community Server 社区版本,开源免费 ...
- Linux命令应用大词典-第19章 文件系统管理
19.1 mkfs:创建Linux文件系统 19.2 mke2fs:创建ext2.3.4文件系统 19.3 mkfs.ext4:创建ext4文件系统 19.4 mkfs.ext3:创建ext3文件系统 ...
- Python字符串格式化符号及转义字符含义(非常全!!!)
字符串格式化符号含义 符号 说明 %c 格式化字符及其 ASCII 码 %s 格式化字符串 %d 格式化整数 %o 格式化无符号八进制数 %x 格式化无符号十六进制数 %X 格式化无符号十六进制数(大 ...
- 题解 CF191C 【Fools and Roads】
树上差分半裸题 常规思路是进行三次DFS,然后常规运算即可 这里提供两次dfs的思路(wyz tql orz) 我们以样例2为例 我们考虑任意一条路径,令其起点为u终点为v,每走一次当前路径则v的访问 ...
- python中出现ascii编码问题的解决办法
一劳永逸,一次性全盘解决的办法 环境变量中去设置 以centos 7为例: vim /etc/profile export PYTHONIOENCODING=utf-8 source /etc/pro ...
- python爬虫基础之一(爬淘宝)
没想到python如此强大, 今天看一会视频学会了一段python爬虫 这就是我今天学到的内容爬去淘宝网关于书包的一些信息,包括价格, #coding=utf-8 import requests#导入 ...
- mpvue笔记
简介: mpvue 修改了 Vue.js 的 runtime 和 compiler 实现,为小程序开发引入 Vue.js 开发体验 我觉得就像scss一样,写的时候方便,最后还是要转成css文件 搭建 ...
- lintcode172 删除元素
删除元素 给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度. 元素的顺序可以改变,并且对新的数组不会有影响. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一个数组 [0, ...
- 孤荷凌寒自学python第八十三天初次接触ocr配置tesseract环境
孤荷凌寒自学python第八十三天初次接触ocr配置tesseract环境 (完整学习过程屏幕记录视频地址在文末) 学习Python我肯定不会错过图片文字的识别,当然更重要的是简单的验证码识别了,今天 ...
- 剑指offer-二叉树中和为某一值的路径24
题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大 ...