传送门

维护区间覆盖成非负数,区间变成max(xi+a,0)" role="presentation" style="position: relative;">max(xi+a,0)max(xi+a,0),询问区间中0" role="presentation" style="position: relative;">00的个数。

由于每次操作之后区间中都是非负数,因此相当于只用维护最小值和最小值的个数。

对于将一个区间变成max(xi+a,0)" role="presentation" style="position: relative;">max(xi+a,0)max(xi+a,0)的操作,我的想法是将它转化成xi=xi+a" role="presentation" style="position: relative;">xi=xi+axi=xi+a,xi=max(xi,0)" role="presentation" style="position: relative;">xi=max(xi,0)xi=max(xi,0),前者直接打懒标记,后者则是维护区间次小值转化为将最小值进行覆盖的情况。理论时间复杂度下界是O(mlogn2)" role="presentation" style="position: relative;">O(mlogn2)O(mlogn2),但是实际的运行效率更像是常数中等的O(mlogn)" role="presentation" style="position: relative;">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;
}

2018.07.30 bzoj4355: Play with sequence(线段树)的更多相关文章

  1. 2018.10.30 bzoj4942: [Noi2017]整数(线段树压位)

    传送门 直接把修改的数拆成logloglog个二进制位一个一个修改是会TLETLETLE的. 因此我们把303030个二进制位压成一位储存在线段树里面. 然后维护区间中最靠左二进制位不为0/1的下标. ...

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

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

  3. 2018.07.08 hdu6183 Color it(线段树)

    Color it Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Proble ...

  4. 2018.07.08 POJ 2481 Cows(线段树)

    Cows Time Limit: 3000MS Memory Limit: 65536K Description Farmer John's cows have discovered that the ...

  5. 2016暑假多校联合---Rikka with Sequence (线段树)

    2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...

  6. 2018.07.30 cogs2632. [HZOI 2016] 数列操作d(线段树)

    传送门 线段树基本操作 区间加等差数列,维护区间和. 对于每个区间维护等差数列首项和公差,易证这两个东西都是可合并的,然后使用小学奥数的知识就可以切掉这题. 代码: #include<bits/ ...

  7. 2018.07.23 hdu5828 Rikka with Sequence(线段树)

    传送门 这道题维护区间加,区间开根,区间求和. 线段树常规操作. 首先回忆两道简单得多的线段树. 第一个:区间覆盖,区间加,区间求和. 第二个:区间开根,区间求和. 这两个是名副其实的常规操作. 但这 ...

  8. 【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]里的每个数 ...

  9. HDU 6047 Maximum Sequence(线段树)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=6047 题目: Maximum Sequence Time Limit: 4000/2000 MS (J ...

随机推荐

  1. 13.小结Action

    转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 在struts2中一个普通的java类只要有public String ex ...

  2. framework4.0 IIS配置支持ashx

    framework4.0 https://www.microsoft.com/zh-cn/download/details.aspx?id=17718 IIS添加对ashx文件的支持 http://w ...

  3. EL&jsp

    JSP 2.0(java server pages): EL 表达式 JSP九大内置对象及作用范围 JSP Directive JSP Action EL表达式: EL 算法(Arithmetic)表 ...

  4. C++11中std::forward的使用 (转)

    std::forward argument: Returns an rvalue reference to arg if arg is not an lvalue reference; If arg ...

  5. TPCC-MySQL的安装与使用

    Tpcc-mysql 是 percona 基于 tpcc 衍生出来的产品,专用于 mysql 基准测试,其源码放在 bazaar 上( Bazaar 是一个分布式的版本控制系统,采用 GPL 许可协议 ...

  6. Eclipse中Ctrl+Shift+f快捷键无效的解决方式

    某天突然发现idea非常重要的快捷键ctrl+shift+f无效了,网上搜了很多都说是qq快捷键冲突,但是找了下qq快捷键却没有解决,现在给大家一个解决快捷键冲突的思路: 1.查看QQ快捷键--> ...

  7. Hadoop主要架构

    主要架构图 各部分作用 * Core:核心支持,内核代码 * MapReduce:映射数据 * HDFS:文件存储 * ZooKepper:服务器节点和进程通信的协调工具 * Pig:支持用户和Map ...

  8. ArcGIS案例学习笔记4_2

    ArcGIS案例学习笔记4_2 联系方式:谢老师,135_4855_4328,xiexiaokui#qq.com 时间:第4天下午 案例1:批量水文分析地理建模 数据:实验数据\Chp11\tutor ...

  9. 数据类型-Series

    数据类型-Series Series数据类型由一组数据和数据相关的索引组成,键 -> 值 Series数据类型可视为:一维 带标签 数组 Series基本操作类似数组和字典 Series数据类型 ...

  10. knn手写识别

    import numpy as np import operator import os #KNN算法 def knn(k,testdata,traindata,labels):#(k,测试样本,训练 ...