传送门
维护区间覆盖成非负数,区间变成max(xi+a,0)max(xi+a,0),询问区间中00的个数。
由于每次操作之后区间中都是非负数,因此相当于只用维护最小值和最小值的个数。
对于将一个区间变成max(xi+a,0)max(xi+a,0)的操作,我的想法是将它转化成xi=xi+axi=xi+a,xi=max(xi,0)xi=max(xi,0),前者直接打懒标记,后者则是维护区间次小值转化为将最小值进行覆盖的情况。理论时间复杂度下界是O(mlogn2)O(mlogn2),但是实际的运行效率更像是常数中等的O(mlogn)O(mlogn)。
代码:

#include<bits/stdc++.h>
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
#define N 300005
#define inf 1e18
#define ll long long
using namespace std;
inline ll read(){ll ans=0,w=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();return ans*w;
}
int n,m,a[N];
struct Node{int l,r,cnt;ll add,cov,mn,sn;}T[N<<2];
inline ll min(ll a,ll b){return a<b?a:b;}
inline void pushup(int p){T[p].mn=min(T[lc].mn,T[rc].mn);T[p].cnt=(T[lc].mn==T[p].mn?T[lc].cnt:0)+(T[rc].mn==T[p].mn?T[rc].cnt:0);T[p].sn=min(T[p].mn==T[lc].mn?T[lc].sn:T[lc].mn,T[p].mn==T[rc].mn?T[rc].sn:T[rc].mn);
}
inline void pushadd(int p,ll v){T[p].add+=v,T[p].mn+=v;if(T[p].sn!=inf)T[p].sn+=v;
}
inline void pushset(int p,ll v){T[p].add=0,T[p].cov=T[p].mn=v,T[p].sn=inf,T[p].cnt=T[p].r-T[p].l+1;}
inline void pushmin(int p,ll v){if(T[p].mn>=v)return;T[p].mn=v;}
inline void pushdown(int p){if(T[p].cov!=-1)pushset(lc,T[p].cov),pushset(rc,T[p].cov);if(T[p].add)pushadd(lc,T[p].add),pushadd(rc,T[p].add);pushmin(lc,T[p].mn),pushmin(rc,T[p].mn);T[p].cov=-1,T[p].add=0;
}
inline void build(int p,int l,int r){T[p].l=l,T[p].r=r,T[p].add=0,T[p].cov=-1;if(l==r){T[p].mn=a[l],T[p].sn=inf,T[p].cnt=1;return;}build(lc,l,mid),build(rc,mid+1,r),pushup(p);
}
inline void update(int p,int ql,int qr,ll v){if(ql>T[p].r||qr<T[p].l)return;if(ql<=T[p].l&&T[p].r<=qr)return pushset(p,v);pushdown(p);if(qr<=mid)update(lc,ql,qr,v);else if(ql>mid)update(rc,ql,qr,v);else update(lc,ql,mid,v),update(rc,mid+1,qr,v);pushup(p);
}
inline void updadd(int p,int ql,int qr,ll v){if(ql>T[p].r||qr<T[p].l)return;if(ql<=T[p].l&&T[p].r<=qr)return pushadd(p,v);pushdown(p);if(qr<=mid)updadd(lc,ql,qr,v);else if(ql>mid)updadd(rc,ql,qr,v);else updadd(lc,ql,mid,v),updadd(rc,mid+1,qr,v);pushup(p);
}
inline void modify(int p,int ql,int qr){if(ql>T[p].r||qr<T[p].l||T[p].mn>=0)return;if(ql<=T[p].l&&T[p].r<=qr&&T[p].sn>0)return pushmin(p,0);pushdown(p);if(qr<=mid)modify(lc,ql,qr);else if(ql>mid)modify(rc,ql,qr);else modify(lc,ql,mid),modify(rc,mid+1,qr);pushup(p);
}
inline int query(int p,int ql,int qr){if(ql>T[p].r||qr<T[p].l||T[p].mn)return 0;if(ql<=T[p].l&&T[p].r<=qr)return T[p].cnt;pushdown(p);if(qr<=mid)return query(lc,ql,qr);if(ql>mid)return query(rc,ql,qr);return query(lc,ql,mid)+query(rc,mid+1,qr);
}
int main(){n=read(),m=read();for(int i=1;i<=n;++i)a[i]=read();build(1,1,n);while(m--){int op=read(),l=read(),r=read();if(op==1){ll v=read();update(1,l,r,v);}if(op==2){ll v=read();updadd(1,l,r,v),modify(1,l,r);}if(op==3)printf("%d\n",query(1,l,r));}return 0;
}

转载于:https://www.cnblogs.com/ldxcaicai/p/9738408.html

2018.07.30 bzoj4355: Play with sequence(线段树)相关推荐

  1. 2018.09.30 bzoj2288:生日礼物(贪心+线段树)

    传送门 线段树经典题目. 每次先找到最大子段和来更新答案,然后利用网络流反悔退流的思想把这个最大字段乘-1之后放回去. 代码: #include<bits/stdc++.h> #defin ...

  2. 2018.07.30 巴别时代

    * 项目部署更新 用符号链接 project => project1, project2 ln -s project2 project * composer自动加载机制 namespace =& ...

  3. 【bzoj4355】Play with sequence 线段树区间最值操作

    题目描述 维护一个长度为N的序列a,现在有三种操作: 1)给出参数U,V,C,将a[U],a[U+1],...,a[V-1],a[V]都赋值为C. 2)给出参数U,V,C,对于区间[U,V]里的每个数 ...

  4. 2018年6月2号(线段树(2))

    昨天只是普通的线段树(简单的单点修改) 而今天将讲是比较普通的简单的区间修改(加法修改): 我主要是复制代码的蒟蒻我只能依靠模板为生,所以我想特地练下手: 1 #include<bits/std ...

  5. [集训队作业2018] 三角形(贪心,堆,线段树合并)

    传送门 首先,在结点uuu放上w[u]w[u]w[u]个石子后,出于贪心考虑,下一步一定会把uuu的所有儿子vvv上的石子收回手中. 转换题意: 记cntcntcnt为当下树上的石子数,对每个结点uu ...

  6. codeforces CF438D The Child and Sequence 线段树

    $ \Rightarrow $ 戳我进CF原题 D. The Child and Sequence time limit per test: 4 seconds memory limit per te ...

  7. Codeforces Round #250 (Div. 1) D. The Child and Sequence 线段树 区间取摸

    D. The Child and Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest ...

  8. BZOJ5249: [2018多省省队联测]IIIDX(线段树 贪心)

    题意 题目链接 Sol 不难发现题目给出的是一个树,其中\(\frac{i}{K}\)是\(i\)的父亲节点 首先,当\(d_i\)互不相同时,一个显然的贪心策略就是优先给编号小的分配较大的权值.可以 ...

  9. 2019ICPC(南京) - Greedy Sequence(线段树)

    题目链接:点击查看 题目大意:题意不明(英语渣),网上的简洁版转化: 对于每个i,所在下标p[i],在[p[i]−k,p[i]+k]中找到小于i的最大数x,然后ans[i]=ans[x]+1即可. 题 ...

最新文章

  1. BEP 7:CUDA外部内存管理插件(上)
  2. 什么是SESSION?(二)
  3. 100天后 - 100-days-later
  4. C++用顶层函数重载操作符
  5. Mahout推荐算法API详解
  6. buu-crypto-yxx
  7. 表的插入、更新、删除、合并操作_19_通过表关联删除记录
  8. YouTube测试购物功能、 2021 最值得效力的科技公司榜单、2020 移动应用年度报告等|Decode the Week...
  9. iOS之地理位置及定位系统 -- 入门笔记(用Swift)
  10. 奇异值分解SVD(证明全部省略)
  11. 教你如何配置IIS Rewrite模块写规则
  12. 好用的源码行数统计工具——cloc
  13. 神州微型计算机,神舟笔记本序列号查维修-怎样根据神舟笔记本电脑的序列号查询...
  14. RedHat 终端大小写不能切换问题
  15. 计算机忘记密码WIN7,win7忘记密码强制重置方法
  16. 游戏加速器安卓apk代码
  17. Word文档人民币符号怎么打出来
  18. 南京邮电大学操作系统实验二:线程的互斥与同步
  19. vscode@局部替换文本/正则匹配分组替换(复杂删除修改替换)/目录检索_模糊匹配工作空间的目录
  20. 中国最优秀、最强的基金公司有哪些

热门文章

  1. 从零开始的操作系统生活01-Hello World
  2. 在浏览器地址栏输入一个URL后回车,执行的全部过程
  3. 51nod1431 快乐排队
  4. 支持免费试用的香港云服务器推荐
  5. 计算机里的文案怎么设置背景,PPT怎么设置单个幻灯片为背景样式4?网友:原来这么简单!...
  6. centos7安装配置yum软件仓库
  7. 英语初级语法--句子成分(词性)(成分)
  8. 湖北大学计算机学院胡院长,胡书山-湖北大学计算机与信息工程学院
  9. kali查看进程PS
  10. 英伟达GTX 960M安装anaconda、cuda+cudnn