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——题解的更多相关文章

  1. 【CF486E】LIS of Sequence题解

    [CF486E]LIS of Sequence题解 题目链接 题意: 给你一个长度为n的序列a1,a2,...,an,你需要把这n个元素分成三类:1,2,3: 1:所有的最长上升子序列都不包含这个元素 ...

  2. BZOJ4355: Play with sequence

    BZOJ4355: Play with sequence https://lydsy.com/JudgeOnline/problem.php?id=4355 分析: 模板题. 把\(2\)操作看成先区 ...

  3. bzoj4355 Play with sequence(吉司机线段树)题解

    题意: 已知\(n\)个数字,进行以下操作: \(1.\)区间\([L,R]\) 赋值为\(x\) \(2.\)区间\([L,R]\) 赋值为\(max(a[i] + x, 0)\) \(3.\)区间 ...

  4. CF3D Least Cost Bracket Sequence 题解

    题目 This is yet another problem on regular bracket sequences. A bracket sequence is called regular, i ...

  5. POJ3581:Sequence——题解

    http://poj.org/problem?id=3581 给一串数,将其分成三个区间并且颠倒这三个区间,使得新数列字典序最小. 参考:http://blog.csdn.net/libin56842 ...

  6. Pop Sequence 题解

    Pop Sequence(PAT) https://www.nowcoder.com/pat/5/problem/4090 前言: PAT上一道Stack的应用题,简化版的有<信息学一本通·普及 ...

  7. CF524F And Yet Another Bracket Sequence 题解

    题目链接 算法:后缀数组+ST表+贪心   各路题解都没怎么看懂,只会常数巨大的后缀数组+ST表,最大点用时 \(4s\), 刚好可以过... 确定合法序列长度   首先一个括号序列是合法的必须满足以 ...

  8. Codeforces 486E LIS of Sequence 题解

    题目大意: 一个序列,问其中每一个元素是否为所有最长上升子序列中的元素或是几个但不是所有最长上升子序列中的元素或一个最长上升子序列都不是. 思路: 求以每一个元素为开头和结尾的最长上升子序列长度,若两 ...

  9. TopCoder SRM 625 Incrementing Sequence 题解

    本题就是给出一个数k和一个数组,包含N个元素,通过每次添加�数组中的一个数的操作,最后须要得到1 - N的一个序列,不用排序. 能够从暴力法入手,然后优化. 这里利用hash表进行优化,终于得到时间效 ...

随机推荐

  1. 机器学习常用算法(LDA,CNN,LR)原理简述

    1.LDA LDA是一种三层贝叶斯模型,三层分别为:文档层.主题层和词层.该模型基于如下假设:1)整个文档集合中存在k个互相独立的主题:2)每一个主题是词上的多项分布:3)每一个文档由k个主题随机混合 ...

  2. eclipse+tomcat配置远程debug调整

    由于开发环境与真实服务器环境存在差异,有时开发时明明正常的逻辑,部署之后就会出现各种各样的问题,通过日志邮不能明确定位到问题的时候,可以采用远程debug调试来定位问题.下面就介绍一下具体的配置步骤: ...

  3. 一个只有十行的精简MVVM框架

    本文来自网易云社区. 前言 MVVM模式相信做前端的人都不陌生,去网上搜MVVM,会出现一大堆关于MVVM模式的博文,但是这些博文大多都只是用图片和文字来进行抽象的概念讲解,对于刚接触MVVM模式的新 ...

  4. 【springboot-01】整合quartz

    1.什么是quartz? quartz是一个开源的定时任务框架,具备将定时任务持久化至数据库以及分布式环境下多节点调度的能力.当当的elastic-job便是以quartz为基础,结合zookeepe ...

  5. cf#516C. Oh Those Palindromes(最多回文子串的字符串排列方式,字典序)

    http://codeforces.com/contest/1064/problem/C 题意:给出一个字符串,要求重新排列这个字符串,是他的回文子串数量最多并输出这个字符串. 题解:字典序排列的字符 ...

  6. 原生js常用方法

    原生JavaScript设置cookie值 function setCookie(name, value, Hours) { var d = new Date(); var offset = 8; v ...

  7. 开源自动驾驶仿真平台 AirSim (1) - Unreal Engine

    AirSim 官方Github: https://github.com/Microsoft/AirSim AirSim 是微软的开源自动驾驶仿真平台(其实它还能做很多事情,这里主要用于自动驾驶仿真研究 ...

  8. Jquery复选框

    Jquery复选框 1.checkbox list选择 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E ...

  9. HTML5文档的各个组成部分分类

    <!DOCTYPE html><!--声明文档结构类型--> <html lang="zh-cn"><!--声明文档文字区域--> ...

  10. C#2d命令行小游戏

    [ 星 辰 · 第 二 条 约 定 ] 要求 空地:空格 | 边界/墙:'█' | 人物:'♜' 实现人物的上下左右移动 记录关系图.流程图.设计过程遇到的问题及解决 项目压缩包 [项目源码](htt ...