调了好久,还是黑盒测试有前途

我以前怕不是学了假的吉利线段树(我第一次知道还要记次小值去更新的........)

#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
int n,m,tr_sz[1500005],a[300005];
ll tag_cov[1500005],tr_min[1500005],tag_add[1500005],tr_sc[1500005];
void update_cov(int t,ll c,int l,int r){
tag_add[t]=0;
tag_cov[t]=tr_min[t]=c,tr_sc[t]=1ll<<60;
//if (t==8) printf("%d %d\n",l,r);
tr_sz[t]=r-l+1;
} void update_add(int t,ll c){
tag_add[t]+=c;
tr_min[t]+=c;
if (tr_sc[t]!=1ll<<60) tr_sc[t]+=c;
}
void update(int t,int l,int r){
ll Min=min(tr_min[t<<1],tr_min[t<<1|1]);
tr_min[t]=Min;
tr_sz[t]=(tr_min[t<<1]==Min?tr_sz[t<<1]:0)+(tr_min[t<<1|1]==Min?tr_sz[t<<1|1]:0);
tr_sc[t]=min(tr_min[t<<1]==Min?tr_sc[t<<1]:tr_min[t<<1],tr_min[t<<1|1]==Min?tr_sc[t<<1|1]:tr_min[t<<1|1]);
if (tr_sz[t]>r-l+1) printf("!!!\n");
}
void update_min(int t,ll c){
tr_min[t]=max(tr_min[t],c);
}
void push_down(int t,int l,int r){
int mid=(l+r)>>1;
if (tag_cov[t]!=-1) update_cov(t<<1,tag_cov[t],l,mid),update_cov(t<<1|1,tag_cov[t],mid+1,r);
if (tag_add[t]) update_add(t<<1,tag_add[t]),update_add(t<<1|1,tag_add[t]);
update_min(t<<1,tr_min[t]),update_min(t<<1|1,tr_min[t]);
tag_cov[t]=-1,tag_add[t]=0;
}
void build(int t,int l,int r){
tag_cov[t]=-1,tag_add[t]=0;
if (l==r){
tr_min[t]=a[l],tr_sc[t]=1ll<<60,tr_sz[t]=1;
return;
}
int mid=(l+r)>>1;
build(t<<1,l,mid);
build(t<<1|1,mid+1,r);
update(t,l,r);
}
void modify_cov(int t,int l,int r,int x,int y,ll c){
if (r<x || l>y) return;
if (l>=x && r<=y){
update_cov(t,c,l,r);
return;
}
push_down(t,l,r);
int mid=(l+r)>>1;
modify_cov(t<<1,l,mid,x,y,c);
modify_cov(t<<1|1,mid+1,r,x,y,c);
update(t,l,r);
}
void modify_add(int t,int l,int r,int x,int y,ll c){
if (r<x || l>y) return ;
if (l>=x && r<=y){
update_add(t,c);
return;
}
push_down(t,l,r);
int mid=(l+r)>>1;
modify_add(t<<1,l,mid,x,y,c);
modify_add(t<<1|1,mid+1,r,x,y,c);
update(t,l,r);
}
void modify_0(int t,int l,int r,int x,int y){
if (r<x || l>y) return;
if (tr_min[t]>=0) return;
if (l>=x && r<=y && tr_sc[t]>0){
update_min(t,0);
return;
}
push_down(t,l,r);
int mid=(l+r)>>1;
modify_0(t<<1,l,mid,x,y);
modify_0(t<<1|1,mid+1,r,x,y);
update(t,l,r);
}
int query(int t,int l,int r,int x,int y){
if (r<x || l>y) return 0;
if (tr_min[t]) return 0;
if (l>=x && r<=y) {
//printf("%d %d %d %d\n",l,r,tr_sz[t],t);
return tr_sz[t];
}
push_down(t,l,r);
int mid=(l+r)>>1;
return query(t<<1,l,mid,x,y)+query(t<<1|1,mid+1,r,x,y);
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1; i<=n; i++) scanf("%d",&a[i]);
build(1,1,n);
while (m--){
int cas,l,r,c;
scanf("%d%d%d",&cas,&l,&r);
if (cas==1 || cas==2) scanf("%d",&c);
if (cas==1) modify_cov(1,1,n,l,r,c);
if (cas==2) modify_add(1,1,n,l,r,c),modify_0(1,1,n,l,r);
if (cas==3) printf("%d\n",query(1,1,n,l,r));
}
return 0;
}

  

BZOJ 4355: Play with sequence的更多相关文章

  1. BZOJ.4355.Play with sequence(线段树)

    题目链接 问题在于操作二.操作二可以拆分成:区间加\(C\).区间(对\(0\))取\(\max\). 注意到操作一的\(C\)都是非负数,即数列中不会出现负数,所以我们直接维护最小值和最小值出现的次 ...

  2. bzoj 1005 组合数学 Purfer Sequence

    这题需要了解一种数列: Purfer Sequence 我们知道,一棵树可以用括号序列来表示,但是,一棵顶点标号(1~n)的树,还可以用一个叫做 Purfer Sequence 的数列表示 一个含有 ...

  3. bzoj 2656 [Zjoi2012]数列(sequence) 递推+高精度

    2656: [Zjoi2012]数列(sequence) Time Limit: 2 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Descri ...

  4. 【BZOJ】1367: [Baltic2004]sequence

    题意 给\(n(n \le 10^6)\)个数的序列\(a\),求一个递增序列\(b\)使得\(\sum_{i=1}^{n} |a_i-b_i|\)最小. 分析 神题啊不会. 具体证明看黄源河论文&l ...

  5. bzoj 2656 [Zjoi2012]数列(sequence)(高精度)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2656 [题意] 计算大数递推式 [思路] 高精度 [代码] #include<c ...

  6. bzoj 1367 [ Baltic 2004 ] sequence —— 左偏树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1367 好题啊!论文上的题: 论文上只给出了不下降序列的求法: 先考虑特殊情况,如果原序列上升 ...

  7. BZOJ 3043 [Poetize6] IncDec Sequence

    题目描述 给定一个长度为n的数列$a_1,a_2,--,a_n$​,每次可以选择一个区间[l,r],使这个区间内的数都加1或者都减1. 请问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最 ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. BZOJ 1005 [HNOI2008] 明明的烦恼(组合数学 Purfer Sequence)

    题目大意 自从明明学了树的结构,就对奇怪的树产生了兴趣...... 给出标号为 1 到 N 的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为 N( ...

随机推荐

  1. kindeditor编辑器和图片上传独立分开的配置细节

    关于kindeditor编辑器上传按钮的异步加载最关键的部署问题,它的上传图片的组件都已经封装得很好了的,只需要监听到页面按钮的点击事件给编辑器对象传递一些对应的初始化参数即可显示图片上传的弹窗实现异 ...

  2. c#基础3-方法的重载静态和非静态,字段属性,方法

    方法的重载概念:方法的重载指的就是方法的名称相同给,但是参数不同.参数不同,分为两种情况1).如果参数的个数相同,那么参数的类型就不能相同.2).如果参数的类型相同,那么参数的个数就不能相同.***方 ...

  3. 基于JAVA的设计模式之组合模式

    概念 将所有对象组合成一种树形结构,有分支节点.叶子节点,分支节点可以有自己的子节点,子节点可以是分支节点.叶子节点,可以进行增删的操作,而叶子节点不可以.比如文件夹就是一个分支节点,而文件就是一个叶 ...

  4. NIO学习之Channel

    一.Channel基础 通道是一个对象,通过它可以读取和写入数据,Channel就是通向什么的道路,为数据的流向提供渠道: 在传统IO中,我们要读取一个文件中的内容使用Inputstream,该str ...

  5. jQuery知识点小结

    博主之前学习一段时间后做了点Demo,借此机会发出来分享,其实学jQuery只要简单看看文档即可,但有些细枝末节的东西文档会默认使用者是了解的,所以还是得系统学习系统训练:Talk is cheap, ...

  6. deb软件安装

    deb是debian linux的安装格式,跟red hat的rpm非常相似,最基本的安装命令是:dpkg -i file.deb dpkg 是Debian Package的简写,是为Debian 专 ...

  7. PHP_RAW_POST_DATA特性

    在PHP5.6.x中已废止特性 使用 always_populate_raw_post_data 会导致在填充 $HTTP_RAW_POST_DATA 时产生 E_DEPRECATED 错误. 请使用 ...

  8. Linux系统日志分析

    Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出我们需要的信息. 大部分Linux发行版默认的日志守护进程为 syslog,位于 /etc/syslog 或 / ...

  9. iOS-浅谈runtime运行时机制02-runtime简单使用

    http://blog.csdn.net/jiajiayouba/article/details/44201079 由于OC是运行时语言,只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方 ...

  10. 编写sql查询语句思路

    编写查询语句思路/* 1.首先确定最终输出结果的列,包括几个方面:A.首先这些列来自于一个 表.还是多个表,如果是多个表则可能用到多表查询的(等值连接.不等值 连接.外连接.自连接):B.这些列是直接 ...