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

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

#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;
}

  

最新文章

  1. 三道Javascript的练习题
  2. MySQL定时器开启、调用实现代码
  3. iPhone:4.7 5.5 4 3.5 对应的各个设备屏幕尺寸对应的像素及App上线信息
  4. 关于cmbiling.jar cocos2dx的问题
  5. Android ListView ListActivity PreferenceActivity背景变黑的问题ZT
  6. jquery easyui combobox
  7. android布局ui
  8. 关于input在li列表中居中显示
  9. Python编程快速上手——让繁琐工作自动化学习笔记
  10. ligerUI---ligerGrid默认选中checkbox
  11. 解决input框自动填充为黄色的问题
  12. Dapper内部分享ppt
  13. spring框架学习(二)使用注解代替xml配置
  14. hdu 5775 Bubble Sort 树状数组
  15. 1、QThreadPool线程池的使用,线程和Widget通过QMetaObject::invokeMethod交互。
  16. 【DB】部分MySQL操作记录
  17. Ubuntu菜鸟入门(十四)—— 设置root密码
  18. 吴裕雄 数据挖掘与分析案例实战(14)——Kmeans聚类分析
  19. OpenWrt设置访客网络Guest Wi-Fi
  20. Spring Boot 2.0 Intellij Idea 中图文详解打包成可执行Jar

热门文章

  1. Java 多线程概念
  2. 洛谷P1081 开车旅行70分
  3. swift 监听键盘弹出的高度
  4. 实现strcpy函数
  5. SharePoint 2013 安装配置(2)
  6. SQLServer 2012 报表服务部署配置(1)
  7. 洛谷 P1903 【模板】分块/带修改莫队(数颜色)
  8. 【UWP】【新坑】Excel批量翻译工具(1)
  9. 融云SDK触达用户数破20亿 王者风范双倍展现
  10. Array - Container With Most Water