线段树 WA 求 Hack
查看原帖
线段树 WA 求 Hack
83999
Demoe楼主2020/12/19 14:03

全部是把 Yes 判成 No /shq/cy

代码中 query1 求 i=lrai\sum\limits_{i=l}^ra_i query2 求 i=lrai2\sum\limits_{i=l}^ra_i^2 query3 求 min\min query4 求 max\max

判断方式是判断 maxmin\max - \mini=lrai\sum\limits_{i=l}^ra_ii=lrai2\sum\limits_{i=l}^ra_i^2

(线段树除了取模应该没锅/kel)

// wish to get better qwq

#include<bits/stdc++.h>
#define re register ll
#define pb push_back
#define xl (x<<1)
#define xr (x<<1|1)
#define mid ((l+r)>>1)
#define int long long

using namespace std;
typedef long long ll;

template <typename T> void rd(T &x){
	int fl=1;x=0;char c=getchar();
	for(;!isdigit(c);c=getchar()) if(c=='-') fl=-fl;
	for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
	x*=fl;
}
void wr(int x){
	if(x<0) x=-x,putchar('-');
	if(x<10) putchar(x+'0');
	if(x>9) wr(x/10),putchar(x%10+'0');
}

// ---------- IO ---------- //

const int N=5e5+5,mod=1e9+7,M=1e9+10;
int n,m,v[N],ans,two,six;

inline int pw(int x,int y){
	int sum=1;
	while(y){
		if(y&1) sum=(sum*x)%mod;
		x=(x*x)%mod;y>>=1;
	}
	return sum;
}

struct Segment_Tree{
	int sum[N<<2],ss[N<<2],lazy[N<<2],maxn[N<<2],minn[N<<2];
	inline void pushup(int x){
		maxn[x]=max(maxn[xl],maxn[xr]);
		minn[x]=min(minn[xl],minn[xr]);
		(sum[x]=sum[xl]+sum[xr])%=mod;
		(ss[x]=ss[xl]+ss[xr])%=mod;
	}
	inline void build(int l,int r,int x){
		if(l==r){maxn[x]=minn[x]=sum[x]=v[l];ss[x]=v[l]*v[l]%mod;return ;}
		build(l,mid,xl);build(mid+1,r,xr);
		pushup(x);
	}
	inline void pushdown(int x,int l,int r){
		lazy[xl]+=lazy[x];
		lazy[xr]+=lazy[x];
		maxn[xl]+=lazy[x];
		maxn[xr]+=lazy[x];
		minn[xl]+=lazy[x];
		minn[xr]+=lazy[x];
		(ss[xl]+=sum[xl]*lazy[x]%mod*2ll+lazy[x]*lazy[x]%mod*(mid-l+1ll)%mod)%=mod;
		(ss[xr]+=sum[xr]*lazy[x]%mod*2ll+lazy[x]*lazy[x]%mod*(r-mid)%mod)%=mod;
		(sum[xl]+=lazy[x]*(mid-l+1ll))%=mod;
		(sum[xr]+=lazy[x]*(r-mid))%=mod;
		lazy[x]=0;
	}
	inline void modify(int L,int R,int l,int r,int k,int x){
		if(l>R||r<L||l>r) return ;
		if(L<=l&&r<=R){lazy[x]+=k;maxn[x]+=k;minn[x]+=k;(ss[x]+=k*sum[x]*2ll+k*k%mod*(r-l+1ll))%=mod;(sum[x]+=k*(r-l+1ll))%=mod;return ;}
		pushdown(x,l,r);
		modify(L,R,l,mid,k,xl);modify(L,R,mid+1,r,k,xr);
		pushup(x);
	}
	inline int query1(int L,int R,int l,int r,int x){
		if(l>R||r<L||l>r) return 0;
		if(L<=l&&r<=R) return sum[x];
		pushdown(x,l,r);pushup(x);
		return (query1(L,R,l,mid,xl)+query1(L,R,mid+1,r,xr))%mod;
	}
	inline int query2(int L,int R,int l,int r,int x){
		if(l>R||r<L||l>r) return 0;
		if(L<=l&&r<=R) return ss[x];
		pushdown(x,l,r);pushup(x);
		return (query2(L,R,l,mid,xl)+query2(L,R,mid+1,r,xr))%mod;
	}
	inline int query3(int L,int R,int l,int r,int x){
		if(l>R||r<L||l>r) return 0;
		if(L<=l&&r<=R) return maxn[x];
		pushdown(x,l,r);pushup(x);
		return max(query3(L,R,l,mid,xl),query3(L,R,mid+1,r,xr));
	}
	inline int query4(int L,int R,int l,int r,int x){
		if(l>R||r<L||l>r) return M;
		if(L<=l&&r<=R) return minn[x];
		pushdown(x,l,r);pushup(x);
		return min(query4(L,R,l,mid,xl),query4(L,R,mid+1,r,xr));
	}
}tr;

// ---------- Segment Tree ---------- //

signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
//	ios::sync_with_stdio(0);
	rd(n);rd(m);two=pw(2ll,mod-2);six=pw(6ll,mod-2);
	for(re i=1;i<=n;i++) rd(v[i]);
	tr.build(1,n,1);
	int op,a,b,k;
	for(re i=1;i<=m;i++){
		rd(op);rd(a);rd(b);a^=ans;b^=ans;
		if(op==1) tr.modify(a,a,1,n,b-v[a],1),v[a]=b;
		else{
			rd(k);k^=ans;
			int qaq=tr.query3(a,b,1,n,1),qwq=tr.query4(a,b,1,n,1);
		//	cout<<a<<' '<<b<<' '<<tr.query1(a,b,1,n,1)<<' '<<tr.query2(a,b,1,n,1)<<' '<<a<<' '<<b<<' '<<(b*(b+1)*(b*2+1)%mod-(a-1)*a*(a*2-1)%mod+mod)%mod*pw(6,mod-2)%mod<<endl;
			if(qaq-qwq!=(b-a)*k){puts("No");continue;}
			if(tr.query1(a,b,1,n,1)%mod!=(qaq+qwq)%mod*(qaq-qwq+1ll)%mod*two%mod){puts("No");continue;}
			if(tr.query2(a,b,1,n,1)%mod!=(qwq*qwq%mod*(b-a+1ll)%mod+k%mod*qwq%mod*(b-a)%mod*(b-a+1ll)%mod+k*k%mod*(b-a)%mod*(b-a+1ll)%mod*(b*2ll-a*2ll+1ll)%mod*six%mod)%mod){puts("No");continue;}
			puts("Yes");ans++;
		}
	}
	return 0;
}

// ---------- Main ---------- //
2020/12/19 14:03
加载中...