社区讨论

如果你90pts并且WA了#6

P1253扶苏的问题参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo98lkqv
此快照首次捕获于
2023/10/28 07:21
2 年前
此快照最后确认于
2023/10/28 07:21
2 年前
查看原帖
也许是你INF开得不够小
我WA#6 version
CPP
#include<cstdio>
#define int long long
const int INF=1e10;
int n,q;
int a[1000010];
struct node
{
	int l;
	int r;
	int maxn;
	int lz1,lz2;
};
struct seg
{
	node t[4000010];
	int max(int a,int b)
	{
		return a>b?a:b;
	}
	void pushup(int k)
	{
		t[k].maxn=max(t[2*k].maxn,t[2*k+1].maxn);
	}
	void lz1down(int k)
	{
		if(t[k].lz1!=-INF)
		{
			t[2*k].lz1=t[2*k+1].lz1=t[k].lz1;
			t[2*k].lz2=t[2*k+1].lz2=0;
			t[2*k].maxn=t[2*k+1].maxn=t[k].lz1;
			t[k].lz1=-INF;
		}
	}
	void lz2down(int k)
	{
		if(t[k].lz2)
		{
			lz1down(k);
			t[2*k].maxn+=t[k].lz2;
			t[2*k+1].maxn+=t[k].lz2;
			t[2*k].lz2+=t[k].lz2;
			t[2*k+1].lz2+=t[k].lz2;
			t[k].lz2=0;
		}
	}
	void build(int k,int l,int r)
	{
		t[k].l=l;
		t[k].r=r;
		t[k].lz1=-INF;
		if(l==r)
		{
			t[k].maxn=a[l];
			t[k].lz1=-INF;
			return ;
		}
		int mid=(l+r)>>1;
		build(2*k,l,mid);
		build(2*k+1,mid+1,r);
		pushup(k);
	}
	void cover(int k,int l,int r,int num)
	{
		if(t[k].l>=l&&t[k].r<=r)
		{
			t[k].maxn=num;
			t[k].lz1=num;
			t[k].lz2=0;
			return ;
		}
		lz1down(k);lz2down(k);
		int mid=(t[k].l+t[k].r)>>1;
		if(l<=mid) cover(2*k,l,r,num);
		if(r>mid) cover(2*k+1,l,r,num);
		pushup(k);
	}
	void add(int k,int l,int r,int num)
	{
		if(t[k].l>=l&&t[k].r<=r)
		{
			lz1down(k);
			t[k].maxn+=num;
			t[k].lz2+=num;
			return ;
		}
		lz1down(k);lz2down(k);
		int mid=(t[k].l+t[k].r)>>1;
		if(l<=mid) add(2*k,l,r,num);
		if(r>mid) add(2*k+1,l,r,num);
		pushup(k);
	}
	int query(int k,int l,int r)
	{
		if(t[k].l>=l&&t[k].r<=r) return t[k].maxn;
		lz1down(k);lz2down(k);
		int ans=-INF;
		int mid=(t[k].l+t[k].r)>>1;
		if(l<=mid) ans=max(ans,query(2*k,l,r));
		if(r>mid) ans=max(ans,query(2*k+1,l,r));
		return ans;
	}
}tree;
signed main()
{
	scanf("%lld%lld",&n,&q);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	tree.build(1,1,n);
	while(q--)
	{
		int op,x,y,z;
		scanf("%lld",&op);
		if(op==1)
		{
			scanf("%lld%lld%lld",&x,&y,&z);
			tree.cover(1,x,y,z);
		}
		if(op==2)
		{
			scanf("%lld%lld%lld",&x,&y,&z);
			tree.add(1,x,y,z);
		}
		if(op==3)
		{
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",tree.query(1,x,y));
		}
	}
	return 0;
}
AC version
CPP
#include<cstdio>
#define int long long
const int INF=1e13;
int n,q;
int a[1000010];
struct node
{
	int l;
	int r;
	int maxn;
	int lz1,lz2;
};
struct seg
{
	node t[4000010];
	int max(int a,int b)
	{
		return a>b?a:b;
	}
	void pushup(int k)
	{
		t[k].maxn=max(t[2*k].maxn,t[2*k+1].maxn);
	}
	void lz1down(int k)
	{
		if(t[k].lz1!=-INF)
		{
			t[2*k].lz1=t[2*k+1].lz1=t[k].lz1;
			t[2*k].lz2=t[2*k+1].lz2=0;
			t[2*k].maxn=t[2*k+1].maxn=t[k].lz1;
			t[k].lz1=-INF;
		}
	}
	void lz2down(int k)
	{
		if(t[k].lz2)
		{
			lz1down(k);
			t[2*k].maxn+=t[k].lz2;
			t[2*k+1].maxn+=t[k].lz2;
			t[2*k].lz2+=t[k].lz2;
			t[2*k+1].lz2+=t[k].lz2;
			t[k].lz2=0;
		}
	}
	void build(int k,int l,int r)
	{
		t[k].l=l;
		t[k].r=r;
		t[k].lz1=-INF;
		if(l==r)
		{
			t[k].maxn=a[l];
			t[k].lz1=-INF;
			return ;
		}
		int mid=(l+r)>>1;
		build(2*k,l,mid);
		build(2*k+1,mid+1,r);
		pushup(k);
	}
	void cover(int k,int l,int r,int num)
	{
		if(t[k].l>=l&&t[k].r<=r)
		{
			t[k].maxn=num;
			t[k].lz1=num;
			t[k].lz2=0;
			return ;
		}
		lz1down(k);lz2down(k);
		int mid=(t[k].l+t[k].r)>>1;
		if(l<=mid) cover(2*k,l,r,num);
		if(r>mid) cover(2*k+1,l,r,num);
		pushup(k);
	}
	void add(int k,int l,int r,int num)
	{
		if(t[k].l>=l&&t[k].r<=r)
		{
			lz1down(k);
			t[k].maxn+=num;
			t[k].lz2+=num;
			return ;
		}
		lz1down(k);lz2down(k);
		int mid=(t[k].l+t[k].r)>>1;
		if(l<=mid) add(2*k,l,r,num);
		if(r>mid) add(2*k+1,l,r,num);
		pushup(k);
	}
	int query(int k,int l,int r)
	{
		if(t[k].l>=l&&t[k].r<=r) return t[k].maxn;
		lz1down(k);lz2down(k);
		int ans=-INF;
		int mid=(t[k].l+t[k].r)>>1;
		if(l<=mid) ans=max(ans,query(2*k,l,r));
		if(r>mid) ans=max(ans,query(2*k+1,l,r));
		return ans;
	}
}tree;
signed main()
{
	scanf("%lld%lld",&n,&q);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	tree.build(1,1,n);
	while(q--)
	{
		int op,x,y,z;
		scanf("%lld",&op);
		if(op==1)
		{
			scanf("%lld%lld%lld",&x,&y,&z);
			tree.cover(1,x,y,z);
		}
		if(op==2)
		{
			scanf("%lld%lld%lld",&x,&y,&z);
			tree.add(1,x,y,z);
		}
		if(op==3)
		{
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",tree.query(1,x,y));
		}
	}
	return 0;
}
可以看到,仅仅将INF从1e10改到1e13,就能AC
但是题目说x109|x|\le10^9
也许是数据炸了?

回复

1 条回复,欢迎继续交流。

正在加载回复...