蜜汁线段树,在线求条(玄关)
查看原帖
蜜汁线段树,在线求条(玄关)
928604
Tiffake楼主2024/5/15 20:21
#include<bits/stdc++.h>
#define int long long
const int N=300001,mod=1e11+3;
using namespace std;
struct node{
	int sum,mx,mn;
}s[N<<2];
int a[N],cnt=0;
#define mid ((l+r)>>1)
void update(node&x,node y){
	x.sum=(x.sum+y.sum)%mod,x.mx=max(x.mx,y.mx),x.mn=min(x.mn,y.mn);
}
void build(int k,int l,int r){
	if(l==r)return s[k]=(node){a[l]*a[l]%mod,a[l],a[l]},void();
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	s[k]=(node){(s[k<<1].sum+s[k<<1|1].sum)%mod,max(s[k<<1].mx,s[k<<1|1].mx),min(s[k<<1].mn,s[k<<1|1].mn)};
}
void change(int k,int l,int r,int x,int v){
	if(l==x&&r==x)return s[k]=(node){v*v%mod,v,v},void();
	if(x<=mid)change(k<<1,l,mid,x,v);
	else change(k<<1|1,mid+1,r,x,v);
//	s[k]=(node){(s[k<<1].sum+s[k<<1|1].sum)%mod,max(s[k<<1].mx,s[k<<1|1].mx),min(s[k<<1].mn,s[k<<1|1].mn)};
}
node ask(int k,int l,int r,int x,int y){
	if(x<=l&&r<=y)return s[k];
	node res=(node){0,INT_MIN,INT_MAX};
	if(x<=mid)update(res,ask(k<<1,l,mid,x,y));
	if(y>mid)update(res,ask(k<<1|1,mid+1,r,x,y));
	return res;
}
#undef mid
string chk(int l,int r,int k,node x){
	if(l==r||(k==0&&x.mx==x.mn))return cnt++,"Yes\n";
	if(x.mx-x.mn!=(r-l)*k)return "No\n";
	int len=(r-l)/k;
	if((6*x.mn%mod*x.mn%mod*(len+1)%mod+(len*(len+1)%mod*(2*len+1)%mod*k%mod+x.mn*len%mod*(len+1)%mod*6%mod)*k%mod)%mod!=x.sum*6%mod)return "No\n";
	return cnt++,"Yes\n";
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int n,m,i,l,r,k,x,y,op;
	cin>>n>>m;
	for(i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	while(m--){
		cin>>op;
		switch(op){
			case 1:cin>>x>>y,x^=cnt,y^=cnt,change(1,1,n,x,y);break;
			case 2:cin>>l>>r>>k,l^=cnt,r^=cnt,k^=cnt,cout<<chk(l,r,k,ask(1,1,n,l,r));break;
		}
	}
	return 0;
}

这会 TLE。

#include<bits/stdc++.h>
#define int long long
const int N=300001,mod=1e11+3;
using namespace std;
struct node{
	int sum,mx,mn;
}s[N<<2];
int a[N],cnt=0;
#define mid ((l+r)>>1)
void update(node&x,node y){
	x.sum=(x.sum+y.sum)%mod,x.mx=max(x.mx,y.mx),x.mn=min(x.mn,y.mn);
}
void build(int k,int l,int r){
	if(l==r)return s[k]=(node){a[l]*a[l]%mod,a[l],a[l]},void();
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	s[k]=(node){(s[k<<1].sum+s[k<<1|1].sum)%mod,max(s[k<<1].mx,s[k<<1|1].mx),min(s[k<<1].mn,s[k<<1|1].mn)};
}
void change(int k,int l,int r,int x,int v){
	if(l==x&&r==x)return s[k]=(node){v*v%mod,v,v},void();
	if(x<=mid)change(k<<1,l,mid,x,v);
	else change(k<<1|1,mid+1,r,x,v);
	return;
	s[k]=(node){(s[k<<1].sum+s[k<<1|1].sum)%mod,max(s[k<<1].mx,s[k<<1|1].mx),min(s[k<<1].mn,s[k<<1|1].mn)};
}
node ask(int k,int l,int r,int x,int y){
	if(x<=l&&r<=y)return s[k];
	node res=(node){0,INT_MIN,INT_MAX};
	if(x<=mid)update(res,ask(k<<1,l,mid,x,y));
	if(y>mid)update(res,ask(k<<1|1,mid+1,r,x,y));
	return res;
}
#undef mid
string chk(int l,int r,int k,node x){
	if(l==r||(k==0&&x.mx==x.mn))return cnt++,"Yes\n";
	if(x.mx-x.mn!=(r-l)*k)return "No\n";
	int len=(r-l)/k;
	if((6*x.mn%mod*x.mn%mod*(len+1)%mod+(len*(len+1)%mod*(2*len+1)%mod*k%mod+x.mn*len%mod*(len+1)%mod*6%mod)*k%mod)%mod!=x.sum*6%mod)return "No\n";
	return cnt++,"Yes\n";
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int n,m,i,l,r,k,x,y,op;
	cin>>n>>m;
	for(i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	while(m--){
		cin>>op;
		switch(op){
			case 1:cin>>x>>y,x^=cnt,y^=cnt,change(1,1,n,x,y);break;
			case 2:cin>>l>>r>>k,l^=cnt,r^=cnt,k^=cnt,cout<<chk(l,r,k,ask(1,1,n,l,r));break;
		}
	}
	return 0;
}

这会 MLE。

2024/5/15 20:21
加载中...