线段树求调
查看原帖
线段树求调
128606
2018ljw一般路过HL人楼主2021/12/7 18:49

3WA 7RE,RE信息

Runtime Error.
Received signal 8: Floating-point exception.

线段树维护区间最大,最小值,平方和,使用 int128 防止溢出.

#include<cstdio>
#define i128 __int128_t
i128 a[300001];
const i128 b=1;
int lastans;
struct tree{
	i128 maxn,minn,sum;
}tre[2400001];
i128 max(i128 x,i128 y){
	return x>y?x:y;
}
i128 min(i128 x,i128 y){
	return x<y?x:y;
}
void pushup(int k){
	tre[k].maxn=max(tre[k<<1].maxn,tre[k<<1|1].maxn);
	tre[k].minn=min(tre[k<<1].minn,tre[k<<1|1].minn);
	tre[k].sum=tre[k<<1].sum+tre[k<<1|1].sum;
}
void build(int k,int l,int r){
	if(l==r){
		tre[k].maxn=tre[k].minn=a[l];
		tre[k].sum=a[l]*a[l];
		return;
	}
	int mid=l+r>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	pushup(k);
}
void change(int k,int l,int r,int x,i128 v){
	if(l==r){
		tre[k].maxn=tre[k].minn=v;
		tre[k].sum=v*v;
		return;
	}
	int mid=l+r>>1;
	if(x<=mid)change(k<<1,l,mid,x,v);
	if(mid<x)change(k<<1|1,mid+1,r,x,v);
	pushup(k);
}
i128 qmax(int k,int l,int r,int x,int y){
	if(l>=x&&r<=y)return tre[k].maxn;
	int mid=l+r>>1;
	i128 ans=0;
	if(x<=mid)ans=max(ans,qmax(k<<1,l,mid,x,y));
	if(mid<y)ans=max(ans,qmax(k<<1|1,mid+1,r,x,y));
	return ans;
}
i128 qmin(int k,int l,int r,int x,int y){
	if(l>=x&&r<=y)return tre[k].minn;
	int mid=l+r>>1;
	i128 ans=b*100000000*100000000*100000000*100000000;
	if(x<=mid)ans=min(ans,qmin(k<<1,l,mid,x,y));
	if(mid<y)ans=min(ans,qmin(k<<1|1,mid+1,r,x,y));
	return ans;
}
i128 qsum(int k,int l,int r,int x,int y){
	if(l>=x&&r<=y)return tre[k].sum;
	int mid=l+r>>1;
	i128 ans=0;
	if(x<=mid)ans+=qsum(k<<1,l,mid,x,y);
	if(mid<y)ans+=qsum(k<<1|1,mid+1,r,x,y);
	return ans;
}
i128 read(){
	i128 x=0;
	char c=getchar();
	while(c<'0'||c>'9')c=getchar();
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x;
}
void write(i128 x){
	if(x<10)putchar(x+'0');
	else write(x/10),putchar(x%10+'0');
}
int main(){
	int n,m,i;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)a[i]=read();
	build(1,1,n);
	while(m--){
		int op;
		scanf("%d",&op);
		if(op==1){
			int x;
			i128 y;
			scanf("%d",&x);
			y=read();
			x^=lastans;
			y^=lastans;
			change(1,1,n,x,y);
			continue;
		}
		int l,r;
		i128 k;
		scanf("%d%d",&l,&r);
		k=read();
		k^=lastans;
		l^=lastans;
		r^=lastans;
		if(l>r){
			int w=l;
			l=r;
			r=w;
		}
		i128 mx=qmax(1,1,n,l,r),mn=qmin(1,1,n,l,r),res=qsum(1,1,n,l,r);
		if((mx-mn)%k!=0){
			printf("No\n");
			continue;
		}
		if((mx-mn)/k+1!=r-l+1){
			printf("No\n");
			continue;
		}
		if(mn*mn*(r-l+1)+mn*k*(r-l+1)*(r-l)+(r-l+1)*(r-l)/(6)*(2*r-2*l+1)*k*k!=res)printf("No\n");
		else printf("Yes\n"),lastans++;
	}
}
2021/12/7 18:49
加载中...