30pts 求助!
查看原帖
30pts 求助!
278605
梨衣楼主2020/11/18 10:24

捆绑测试 #6 #7 wa的比较集中,萌新实在无从下手调试

#include<cstdio>
#define maxn 1000100
using namespace std;
int a[maxn];
struct node{
	int l,r,lw,rw,v,add;
}t[maxn<<2];
void check(int u){
	t[u].lw=t[u<<1].lw,t[u].rw=t[(u<<1)+1].rw;
	if(t[u<<1].rw<=t[(u<<1)+1].lw&&t[u<<1].v&&t[(u<<1)+1].v)t[u].v=1;
	else t[u].v=0;
}
void build(int u,int l,int r){
	t[u].l=l,t[u].r=r;
	if(l==r){
		t[u].lw=t[u].rw=a[l];
		t[u].v=1;
		return;
	}
	int mid=l+r>>1;
	build(u<<1,l,mid);
	build((u<<1)+1,mid+1,r);
	check(u);
}
void spread(int u){
	if(t[u].add){
		t[u<<1].lw+=t[u].add,t[u<<1].rw+=t[u].add;
		t[(u<<1)+1].lw+=t[u].add,t[(u<<1)+1].rw+=t[u].add;
		t[u<<1].add+=t[u].add;
		t[(u<<1)+1].add+=t[u].add;
		t[u].add=0;
	}
}
void change(int u,int x,int y,int z){
	if(x<=t[u].l&&t[u].r<=y){
		t[u].lw+=z,t[u].rw+=z;
		t[u].add+=z;
		return;
	}
	spread(u);
	int mid=t[u].l+t[u].r>>1;
	if(x<=mid)change(u<<1,x,y,z);
	if(y>mid)change((u<<1)+1,x,y,z);
	check(u);
}
node ask(int u,int x,int y){
	node ans,ans1,ans2;
	if(x<=t[u].l&&t[u].r<=y)return t[u];
	spread(u);
	int mid=t[u].l+t[u].r>>1;
	if(mid<x)return ask((u<<1)+1,x,y);
	else if(mid>=y)return ask(u<<1,x,y);
	else {
		ans1=ask(u<<1,x,mid);
		ans2=ask((u<<1)+1,mid+1,y);	
		if(ans1.rw<=ans2.lw&&ans1.v&&ans2.v)ans.v=1;
		else ans.v=0;
	}
	return ans;
}
int main(){
	int n,k;
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	build(1,1,n);
	for(int i=1;i<=k;i++){
		int x,y,z,w;
		node s;
		scanf("%d%d%d",&x,&y,&z);
		if(x==1){
			scanf("%d",&w);
			change(1,y,z,w);
		}
		else{
			s=ask(1,y,z);	
			if(s.v)printf("Yes\n");
			else printf("No\n");
		}
	}
}
2020/11/18 10:24
加载中...