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

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

#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. Windows下用cpu模式跑通目标检测py-faster-rcnn 的demo.py

    关键字:Windows.cpu模式.Python.faster-rcnn.demo.py 声明:原文发表在博客园,未经允许不得转载!!!本篇blog过程已经多名读者实践验证,有人反馈报错TypeErr ...

  2. AJPFX浅析Java数组

    数组(array)是相同类型变量的集合,可以使用共同的名字引用它.数组可被定义为任何类型,可以是一维或多维.数组中的一个特别要素是通过下标来访问它.数组提供了一种将有联系的信息分组的便利方法.注意:如 ...

  3. 告别CMD.windows终端神器conemu设置

    前言 一种刘姥姥进大观园的感觉,现在是见啥啥新鲜.因为之前不怎么接触到命令操作,平时偶尔用用cmd也没觉得什么不妥.直到现在经常调试脚本,使用git越发感觉不方便.看见同事使用的terminal绚丽夺 ...

  4. 3D OpenGL ES

    什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库. 为桌面版本OpenGL 的一个子集. ...

  5. [Java]Eclipse无法import “com.sun.management.OperatingSystemMXBean”的解决方法

    背景: 当使用jdk的自带的API获取系统信息时,代码中import “com.sun.management.OperatingSystemMXBean”出现报错. 解决方法: Eclipse默认把这 ...

  6. [Docker] Docker安装和简单指令

    Docker笔记 安装 sudo apt install docker.io 启动和关闭Docker服务 # 启动Docker服务 sudo service docker start # 关闭Dock ...

  7. 在DataGridView控件中启用换行

    实现效果: 知识运用: DataGridView控件公共属性DefaultCellStyle的WrapMode属性 public DataGridViewTriState WrapMode {  ge ...

  8. Python2 和Python3 的区别

    print Python 2中的print语句被Python 3中的print()函数取代,这意味着在Python 3中必须用括号将需要输出的对象括起来. 在Python 2中使用额外的括号也是可以的 ...

  9. laydate时间控件绑定回调事件

    onclick="laydate({istime: true, format: 'YYYY-MM-DD',choose:checkDate});" //回调函数内容 functio ...

  10. db2的定时备份

    定时任务: db2.bat db2cmd -i -w db2_backup.bat exit db2_backup.bat db2 connect to TEST db2 force applicat ...