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表进行优化,终于得到时间效 ...
随机推荐
- c的多态
使用函数数组,实现多态 参考my_strtoll10
- linux部署MantisBT(二)部署php
二.部署php 1.下载php安装包 http://php.net/downloads.php 2.安装php yum install libxml2 yum install libxml2-deve ...
- js for循环实例
1.求1-100的寄数和? //2.奇数求和 var ppt=0 for(var i=1;i<=100;i+=2){ ppt+=i } 2.求1-100的偶数和 var num=0 for(va ...
- lintcode204 单例
单例 单例 是最为最常见的设计模式之一.对于任何时刻,如果某个类只存在且最多存在一个具体的实例,那么我们称这种设计模式为单例.例如,对于 class Mouse (不是动物的mouse哦),我们应 ...
- 将Render博客搬至GIT(偷懒)
SmallEngine 一个特别小的研究引擎[用于各种实验] 框架上设计上采用Unreal.Unity的设计思路[偷懒了] https://github.com/daozhangXDZ/DZSmall ...
- LeetCode 96——不同的二叉搜索树
1. 题目 2. 解答 以 \(1, 2, \cdots, n\) 构建二叉搜索树,其中,任意数字都可以作为根节点来构建二叉搜索树.当我们将某一个数字作为根节点后,其左边数据将构建为左子树,右边数据将 ...
- SIG蓝牙mesh笔记3_网络结构
目录 3. Mesh Networking 3.1 Bearers 承载层 3.2 Network Layer 网络层 3.2.3 Address validity 地址有效性 3.2.4 Netwo ...
- BZOJ 4176 Lucas的数论 莫比乌斯反演+杜教筛
题意概述:求,n<=10^9,其中d(n)表示n的约数个数. 分析: 首先想要快速计算上面的柿子就要先把d(ij)表示出来,有个神奇的结论: 证明:当且仅当a,b没有相同的质因数的时候我们统计其 ...
- 衡量生活成本:消费者价格指数(CPI, Consumer Price Index)
经济学家应该如何把经济中的许多价格加总成一个单一指数,从而能够衡量价格的总体水平呢?他们可以简单地计算所有产品与服务价格的平均值,但是这种方法的不足之处是把所有的产品与服务等同处理.由于人们购买的鸡比 ...
- 自测之Lesson8:进程操作
题目:请解释wait是如何同步父子进程的. 程序代码: #include <stdio.h> #include <unistd.h> #include <sys/type ...