MnZn 求助线段树+乱搞
查看原帖
MnZn 求助线段树+乱搞
324666
diqiuyi奶龙楼主2023/11/10 20:59

rt,WA 50pts,维护了区间最大最小值和区间 1−31-3 次方和

#include <bits/stdc++.h>
#define ull unsigned long long
#define int unsigned long long
using namespace std;
inline int read(){
	int x=0;char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar());
	for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
	return x;
}
int n,m,x,y,l,r,cnt,k,a[300005],mn[600005],mx[600005],opt;
ull sum[600005],sum2[600005],sum3[600005];
inline ull sm1(int l,int r,int k){
	return 1ull*(l+r)*((r-l)/k+1)/2;
}
inline ull sm2(ull l,ull r,ull k){
	ull t=(r-l)/k;
	return (t+1)*l*l+k*k*t*(t+1)*(t<<1|1)/6+2*l*k*t*(t+1)/2;
}
inline ull sm3(ull l,ull r,ull k){
	ull t=(r-l)/k;
	return (t+1)*l*l*l+3*l*k*k*t*(t+1)*(t<<1|1)/6+3*l*l*k*t*(t+1)/2+k*k*k*t*t*(t+1)*(t+1)/4;
}
void build(int p,int l,int r){
	if(l==r){
		sum[p]=mn[p]=mx[p]=a[l],sum2[p]=1ull*a[l]*a[l],sum3[p]=sum2[p]*sum[p];
		return ;
	}
	int mid=l+r>>1;
	build(mid<<1,l,mid);
	build(mid<<1|1,mid+1,r);
	sum[p]=sum[mid<<1]+sum[mid<<1|1],sum2[p]=sum2[mid<<1]+sum2[mid<<1|1],
	sum3[p]=sum3[mid<<1]+sum3[mid<<1|1],mx[p]=max(mx[mid<<1],mx[mid<<1|1]),mn[p]=min(mn[mid<<1],mn[mid<<1|1]);
}
inline ull gsum1(int p,int l,int r,int lt,int rt){
	if(l>=lt&&r<=rt) return sum[p];
	int mid=l+r>>1;
	ull res=0;
	if(lt<=mid) res+=gsum1(mid<<1,l,mid,lt,rt);
	if(rt>mid) res+=gsum1(mid<<1|1,mid+1,r,lt,rt);
	return res;
}
inline ull gsum2(int p,int l,int r,int lt,int rt){
	if(l>=lt&&r<=rt) return sum2[p];
	int mid=l+r>>1;
	ull res=0;
	if(lt<=mid) res+=gsum2(mid<<1,l,mid,lt,rt);
	if(rt>mid) res+=gsum2(mid<<1|1,mid+1,r,lt,rt);
	return res;
}
inline ull gsum3(int p,int l,int r,int lt,int rt){
	if(l>=lt&&r<=rt) return sum3[p];
	int mid=l+r>>1;
	ull res=0;
	if(lt<=mid) res+=gsum3(mid<<1,l,mid,lt,rt);
	if(rt>mid) res+=gsum3(mid<<1|1,mid+1,r,lt,rt);
	return res;
}
inline int gmax(int p,int l,int r,int lt,int rt){
	if(l>=lt&&r<=rt) return mx[p];
	int mid=l+r>>1,res=0;
	if(mid>=lt) res=max(res,gmax(mid<<1,l,mid,lt,rt));
	if(mid<rt) res=max(res,gmax(mid<<1|1,mid+1,r,lt,rt));
	return res; 
}
inline int gmin(int p,int l,int r,int lt,int rt){
	if(l>=lt&&r<=rt) return mn[p];
	int mid=l+r>>1,res=INT_MAX;
	if(mid>=lt) res=min(res,gmin(mid<<1,l,mid,lt,rt));
	if(mid<rt) res=min(res,gmin(mid<<1|1,mid+1,r,lt,rt));
	return res; 
}
inline void upd(int p,int l,int r,int pos,int val){
	if(l==r){
		sum[p]=mn[p]=mx[p]=val,sum2[p]=1ull*val*val,sum3[p]=sum2[p]*sum[p];
		return ;
	}
	int mid=l+r>>1;
	if(pos<=mid) upd(mid<<1,l,mid,pos,val);
	else upd(mid<<1|1,mid+1,r,pos,val);
	sum[p]=sum[mid<<1]+sum[mid<<1|1],sum2[p]=sum2[mid<<1]+sum2[mid<<1|1],
	sum3[p]=sum3[mid<<1]+sum3[mid<<1|1],mx[p]=max(mx[mid<<1],mx[mid<<1|1]),mn[p]=min(mn[mid<<1],mn[mid<<1|1]);
}
signed main(){
	// cout<<sm3(1,5,2)<<endl;
	n=read(),m=read();
	for(int i=1;i<=n;i++)
		a[i]=read();
	build(1,1,n);
	while(m--){
		opt=read();
		if(opt==1)
			x=read(),y=read(),x^=cnt,y^=cnt,upd(1,1,n,x,y);
		else{
			l=read(),r=read(),k=read();
			l^=cnt,r^=cnt,k^=cnt;
			if(l>r) swap(l,r);
			if(l==r){
			    puts("Yes"),cnt++;
			    continue;
			}
			if(!k){
				if(gmin(1,1,n,l,r)==gmax(1,1,n,l,r)) puts("Yes"),cnt++;
				else puts("No");
				continue;
			}
			// cout<<l<<" "<<r<<" "<<k<<endl; 
			int gmn=gmin(1,1,n,l,r),gmx=gmax(1,1,n,l,r),d=gmx-gmn;
			// cerr<<gmn<<" "<<gmx<<endl;
			if(d%k){
				puts("No");
				continue;
			}
			int dd=d/k+1;
			if(dd^(r-l+1)){
				// cout<< dd <<" "<< r-l+1<<endl;
				puts("No");
				continue;
			}
			// cerr<<sm1(gmn,gmx,k)<<endl;
			if(sm1(gmn,gmx,k)^gsum1(1,1,n,l,r)) puts("No");
			else if(sm2(gmn,gmx,k)^gsum2(1,1,n,l,r)) puts("No");
			else if(sm3(gmn,gmx,k)^gsum3(1,1,n,l,r)) puts("No");
			else cnt++,puts("Yes");
		}
	}
	return 0;
}
2023/11/10 20:59
加载中...