【BZOJ4355】Play with sequence

Description

维护一个长度为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的数字个数。

Input

第一行包含两个正整数N,M(1<=N,M<=300000),分别表示序列长度和操作个数。
第二行包含N个整数,其中第i个数表示a[i](0<=a[i]<=10^9),描述序列的初始状态。
接下来M行描述M个操作,保证1<=U<=V<=N,对于操作1,0<=C<=10^9,对于操作2,|C|<=10^9。

Output

输出若干行,每行一个整数,依次回答每个操作3的问题。

Sample Input

5 3
6 4 6 6 4
2 1 5 -5
1 3 4 4
3 1 5

Sample Output

2

题解:懒了直接粘题解+证明。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <utility>
#define lson x<<1
#define rson x<<1|1
#define mp(A,B) make_pair(A,B)
#define F first
#define S second
using namespace std;
const int maxn=300010;
typedef long long ll;
typedef pair<ll,int> pli;
const ll NON=123456789123456ll;
ll n1[maxn<<2],n2[maxn<<2],ts[maxn<<2],tc[maxn<<2],tn[maxn<<2];
int cnt[maxn<<2];
ll v[maxn];
int n,m;
inline void add(int x,int l,int r,ll v)
{n1[x]+=v,n2[x]+=v;if(tc[x]!=NON)  tc[x]+=v;else ts[x]+=v;if(tn[x]!=NON)  tn[x]+=v;
}
inline void cov(int x,int l,int r,ll v)
{n1[x]=v,n2[x]=NON,cnt[x]=r-l+1,ts[x]=0,tc[x]=v,tn[x]=NON;
}
inline void con(int x,int l,int r,ll v)
{if(n1[x]<v) n1[x]=v;if(tn[x]==NON||tn[x]<v)   tn[x]=v;
}
inline void pushup(int x)
{if(n1[lson]==n1[rson])   n1[x]=n1[lson],n2[x]=min(n2[lson],n2[rson]);else  if(n1[lson]<n1[rson])    n1[x]=n1[lson],n2[x]=min(n2[lson],n1[rson]);else  n1[x]=n1[rson],n2[x]=min(n1[lson],n2[rson]);cnt[x]=0;if(n1[x]==n1[lson])   cnt[x]+=cnt[lson];if(n1[x]==n1[rson])   cnt[x]+=cnt[rson];
}
inline void pushdown(int l,int r,int x)
{int mid=(l+r)>>1;if(ts[x]) add(lson,l,mid,ts[x]),add(rson,mid+1,r,ts[x]),ts[x]=0;if(tc[x]!=NON) cov(lson,l,mid,tc[x]),cov(rson,mid+1,r,tc[x]),tc[x]=NON;if(tn[x]!=NON)   con(lson,l,mid,tn[x]),con(rson,mid+1,r,tn[x]),tn[x]=NON;
}
void upadd(int l,int r,int x,int a,int b,ll v)
{if(a<=l&&r<=b){add(x,l,r,v);return ;}pushdown(l,r,x);int mid=(l+r)>>1;if(a<=mid)   upadd(l,mid,lson,a,b,v);if(b>mid)    upadd(mid+1,r,rson,a,b,v);pushup(x);
}
void upcov(int l,int r,int x,int a,int b,ll v)
{if(a<=l&&r<=b){cov(x,l,r,v);return ;}pushdown(l,r,x);int mid=(l+r)>>1;if(a<=mid)   upcov(l,mid,lson,a,b,v);if(b>mid)    upcov(mid+1,r,rson,a,b,v);pushup(x);
}
void upcon(int l,int r,int x,int a,int b,ll v)
{if(a<=l&&r<=b){if(v<=n1[x])    return ;if(v<n2[x]){con(x,l,r,v);return ;}}pushdown(l,r,x);int mid=(l+r)>>1;if(a<=mid)   upcon(l,mid,lson,a,b,v);if(b>mid)    upcon(mid+1,r,rson,a,b,v);pushup(x);
}
pli query(int l,int r,int x,int a,int b)
{if(a<=l&&r<=b) return mp(n1[x],cnt[x]);pushdown(l,r,x);    int mid=(l+r)>>1;if(b<=mid) return query(l,mid,lson,a,b);if(a>mid)   return query(mid+1,r,rson,a,b);pli sl=query(l,mid,lson,a,b),sr=query(mid+1,r,rson,a,b),ret;if(sl.F==sr.F) ret.F=sl.F,ret.S=sl.S+sr.S;else  if(sl.F<sr.F)    ret=sl;else    ret=sr;return ret;
}
void build(int l,int r,int x)
{tc[x]=tn[x]=NON;if(l==r){n1[x]=v[l],n2[x]=NON,cnt[x]=1;return ;}int mid=(l+r)>>1;build(l,mid,lson),build(mid+1,r,rson);pushup(x);
}
inline int rd()
{int ret=0,f=1;   char gc=getchar();while(gc<'0'||gc>'9')  {if(gc=='-')    f=-f;  gc=getchar();}while(gc>='0'&&gc<='9')  ret=ret*10+(gc^'0'),gc=getchar();return ret*f;
}
int main()
{n=rd(),m=rd();int i,a,b,c,op;for(i=1;i<=n;i++)    v[i]=rd();build(1,n,1);for(i=1;i<=m;i++){op=rd(),a=rd(),b=rd();if(op==1)   c=rd(),upcov(1,n,1,a,b,c);if(op==2)  c=rd(),upadd(1,n,1,a,b,c),upcon(1,n,1,a,b,0);if(op==3){pli tmp=query(1,n,1,a,b);if(tmp.F)   puts("0");else    printf("%d\n",query(1,n,1,a,b).S);}}return 0;
}//4 3 9 5 7 4  1 3 3 2 2 1 3 -7 3 2 4

转载于:https://www.cnblogs.com/CQzhangyu/p/8284282.html

【BZOJ4355】Play with sequence 线段树相关推荐

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

  2. codeforces CF438D The Child and Sequence 线段树

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

  3. 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 ...

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

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

  5. 【 bzoj 4355 】 Play with sequence - 线段树乱搞

    先讲个故事... 据说某一天,claris扔了一道题到某群里面然后引起了不大的讨论~然后好学向上的whx同学发现了这题...聪明的whx想了很久...然后!whx发现看不懂claris给的暴力的证明. ...

  6. UESTC-1546___Bracket Sequence —— 线段树 + 括号序列

    题目链接:点我啊╭(╯^╰)╮ 题目大意: 给出一个括号序列      setsetset -- 将给定区间全部转化为指定括号      reversereversereverse -- 将给定区间的 ...

  7. HDU 5828 Rikka with Sequence (线段树+剪枝优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5828 给你n个数,三种操作.操作1是将l到r之间的数都加上x:操作2是将l到r之间的数都开方:操作3是 ...

  8. Gorgeous Sequence线段树区间跟新

    http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?pid=1018&ojid=0&cid=12578&hide= ...

  9. HDU4893 Wow! Such Sequence! 线段树

    题意:给你一个序列,其中有三种操作 1)位置为K 的数+ D 2)求 l-r 区间和 3)把 l-r 区间里面的所有数都变为理它最近的斐波纳契数 解题思路:这个题的区间更新其实可以在单点更新的时候就得 ...

最新文章

  1. 获取轮廓、获取内接矩形
  2. 9个杰出的免费 WordPress 主题
  3. c语言中fflush的运用为什么没有效果呢,测试平台linux
  4. 使用Intellij IDEA 14.0.2 编译项目耗时特别长的问题
  5. java中主函数抛出的异常怎么解决_java – 从递归函数中抛出异常
  6. 批量恢复文件的Py脚本
  7. 区分'方法'和'函数'
  8. 服务器分虚拟空间,服务器怎样分虚拟主机
  9. python启动方法_python进程开启的两种方式
  10. 情绪对使用产品的影响——读《设计心理学》
  11. 阿里巴巴张勇:创造风口而不是追逐
  12. 图的邻接矩阵(C语言实现)
  13. Hibernate学习资源
  14. IDEA炫酷主题推荐!非常好看!
  15. TwinCAT 3 安全门程序
  16. 蓝桥杯真题 日期问题 c++代码实现 小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 1960 年 1 月 1 日至 2059 年 12 月 31 日。
  17. 文书档案管理系统服务器版,创奇文书档案管理系统客户端官方版
  18. intel 显卡使用cuda吗
  19. Python Pitfall: 时间戳长度- 10位和13位时间戳
  20. 通过命令行操作iOS模拟器

热门文章

  1. 真c++ 从二叉树到红黑树(6)之红黑树RedBlack
  2. 企业需要怎样的CMP多云管理平台?
  3. linux 拼图游戏,立体艺术拼图游戏
  4. 中国软件开发工程师之痛 by 李云~
  5. 从概念到底层技术,区块链一站式分析和汇总(附知识图谱)
  6. DATEADD()函数
  7. elementUi里面的el-input框有时候无法输入的问题
  8. 【LorMe云讲堂】徐凌:利用全基因组促进可持续农业
  9. mysql批量删除5000条数据_mysql批量删除大量数据
  10. Code Sight with Black Duck SCA