社区讨论

神秘代码挂两个点求调

P12525[Aboi Round 1] 私は雨参与者 5已保存回复 10

讨论操作

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

当前回复
9 条
当前快照
1 份
快照标识符
@mlha5rw6
此快照首次捕获于
2026/02/11 08:17
上周
此快照最后确认于
2026/02/12 18:55
7 天前
查看原帖
RT,根号分治限制为447会挂#12和#32,而调到200就能全过
CPP
#include<bits/stdc++.h>
#define limits 447
#define int unsigned int
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
int n,m,type,a[100005],b[505][100005],t,siz,l[4005],r[4005],p[100005],cnt[200005][505];
int sum[505][505][505],maxn;
vector<int>vec[505];
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<48||ch>57){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>=48&&ch<=57){
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
struct ValBlock{
	int t,siz,l[505],r[505],p[200005];
	void init(){
		siz=sqrt(200000);
		t=200000/siz;
		for(int i=1;i<=t;++i){
			l[i]=(i-1)*siz+1;
			r[i]=i*siz;
		}
		if(r[t]!=200000){
			t++;
			l[t]=r[t-1]+1;
			r[t]=200000;
		}
		for(int i=1;i<=t;++i){
			for(int j=l[i];j<=r[i];++j){
				p[j]=i;
			}
		}
//		cout<<"t: "<<t<<'\n';
//		for(int i=1;i<=t;++i){
//			cout<<"i: "<<i<<" l[i]: "<<l[i]<<" r[i]: "<<r[i]<<'\n';
//		}
	}
}blk;
int getleft(int id,int v,int k){
	int l1=1,r1=n,mid,ans=0;
	while(l1<=r1){
		mid=(l1+r1)>>1;
		if(a[b[v][mid]]%v<k||(a[b[v][mid]]%v==k&&b[v][mid]<id))l1=mid+1;
		else{
			ans=mid;
			r1=mid-1;
		}
	}
	if(a[b[v][ans]]%v==k)return ans;
	return 0;
}
int getright(int id,int v,int k){
	int l1=1,r1=n,mid,ans=0;;
	while(l1<=r1){
		mid=(l1+r1)>>1;
		if(a[b[v][mid]]%v<k||(a[b[v][mid]]%v==k&&b[v][mid]<=id)){
			ans=mid;
			l1=mid+1;
		}
		else r1=mid-1;
	}
	if(a[b[v][ans]]%v==k)return ans;
	return 0;
}
int query_min(int x,int y,int x1,int y1,int v,int k){
	int ans=0;
	if(p[y]-p[x]<=1){
		for(int i=x;i<=y;++i){
			if(x1<=a[i]&&a[i]<=y1&&a[i]%v==k){
				ans++;
			}
		}
	}
	else{
		for(int i=x;i<=r[p[x]];++i){
			if(x1<=a[i]&&a[i]<=y1&&a[i]%v==k){
				ans++;
			}
		}
		for(int i=l[p[y]];i<=y;++i){
			if(x1<=a[i]&&a[i]<=y1&&a[i]%v==k){
				ans++;
			}
		}
		if(blk.p[y1]-blk.p[x1]<=1){
			for(int i=x1;i<=y1;++i){
				if(i%v==k){
					ans+=cnt[i][p[y]-1]-cnt[i][p[x]];
				}
			}
		}
		else{
			for(int i=x1;i<=blk.r[blk.p[x1]];++i){
				if(i%v==k){
					ans+=cnt[i][p[y]-1]-cnt[i][p[x]];
				}
			}
			for(int i=blk.l[blk.p[y1]];i<=y1;++i){
				if(i%v==k){
					ans+=cnt[i][p[y]-1]-cnt[i][p[x]];
				}
			}
			int l1=getleft(l[p[x]+1],v,k),r1=getright(r[p[y]-1],v,k);
			if(!l1)return ans;
			if(p[l1]==p[r1]){
				for(int i=l1;i<=r1;++i){
					if(blk.l[blk.p[x1]+1]<=a[b[v][i]]&&a[b[v][i]]<=blk.r[blk.p[y1]-1]){
						ans++;
					}
				}
			}
			else{
				for(int i=l1;i<=r[p[l1]];++i){
					if(blk.l[blk.p[x1]+1]<=a[b[v][i]]&&a[b[v][i]]<=blk.r[blk.p[y1]-1]){
						ans++;
					}
				}
				for(int i=l[p[r1]];i<=r1;++i){
					if(blk.l[blk.p[x1]+1]<=a[b[v][i]]&&a[b[v][i]]<=blk.r[blk.p[y1]-1]){
						ans++;
					}
				}
				ans+=sum[v][p[r1]-1][blk.p[y1]-1]-sum[v][p[r1]-1][blk.p[x1]]-sum[v][p[l1]][blk.p[y1]-1]+sum[v][p[l1]][blk.p[x1]];
			}
		}
	}
	return ans;
}
int query_max(int x,int y,int x1,int y1,int v,int k){
//	cout<<"x: "<<x<<" y: "<<y<<" x1: "<<x1<<" y1: "<<y1<<" v: "<<v<<" k: "<<k<<'\n';
	int ans=0;
	if(p[x]==p[y]){
		for(int i=x;i<=y;++i){
			if(x1<=a[i]&&a[i]<=y1&&a[i]%v==k){
				ans++;
			}
		}
	}
	else{
		for(int i=x;i<=r[p[x]];++i){
			if(x1<=a[i]&&a[i]<=y1&&a[i]%v==k){
				ans++;
			}
		}
		for(int i=l[p[y]];i<=y;++i){
			if(x1<=a[i]&&a[i]<=y1&&a[i]%v==k){
				ans++;
			}
		}
		for(int i=k;i<=maxn;i+=v)if(x1<=i&&i<=y1)ans+=cnt[i][p[y]-1]-cnt[i][p[x]];
	}
	return ans;
}
signed main(){
//	freopen("P12525.in","r",stdin);
//	freopen("P12525.out","w",stdout);
	n=read(),type=read();
	for(int i=1;i<=n;++i){
		a[i]=read();
		maxn=max(maxn,a[i]);
	}
	m=read();
	siz=sqrt(n);
	t=n/siz;
	for(int i=1;i<=t;++i){
		l[i]=(i-1)*siz+1;
		r[i]=i*siz;
	}
	if(r[t]!=n){
		t++;
		l[t]=r[t-1]+1;
		r[t]=n;
	}
	for(int i=1;i<=t;++i){
		for(int j=l[i];j<=r[i];++j){
			p[j]=i;
		}
	}
	for(int i=1;i<=n;++i){
		for(int j=p[i];j<=t;++j){
			cnt[a[i]][j]++;
		}
	}
//	for(int i=1;i<=maxn;++i){
//		for(int j=1;j<=t;++j){
//			cout<<cnt[i][j]<<" ";
//		}
//		cout<<'\n';
//	}
	blk.init();
	for(int i=1;i<=limits;++i){
		for(int j=1;j<=n;++j)vec[a[j]%i].push_back(j);
		int num=0;
		for(int j=0;j<i;++j){
			for(int k=0;k<vec[j].size();++k)b[i][++num]=vec[j][k];
			vec[j].clear();
		}
		for(int j=1;j<=n;++j){
			sum[i][p[j]][blk.p[a[b[i][j]]]]++;
//			cout<<"a[b[i][j]]: "<<a[b[i][j]]<<" blk.p[a[b[i][j]]]: "<<blk.p[a[b[i][j]]]<<'\n';
		}
		for(int j=1;j<=t;++j){
			for(int k=1;k<=blk.t;++k){
				sum[i][j][k]+=sum[i][j-1][k];
			}
		}
		for(int j=1;j<=t;++j){
			for(int k=1;k<=blk.t;++k){
				sum[i][j][k]+=sum[i][j][k-1];
			}
		}
	}
//	for(int i=1;i<=limits;++i){
//		for(int j=1;j<=t;++j){
//			for(int k=1;k<=blk.t;++k){
//				cout<<sum[i][j][k]<<" ";
//			}
//			cout<<'\n';
//		}
//		cout<<'\n';
//	}
//	for(int i=1;i<=limits;++i){
//		for(int j=1;j<=n;++j){
//			cout<<b[i][j]<<" ";
//		}
//		cout<<'\n';
//	}
	int ans=0;
	while(m--){
		int x=read(),y=read(),x1=read(),y1=read(),v=read(),k=read();
		x^=ans*type,y^=ans*type,x1^=ans*type,y1^=ans*type,v^=ans*type,k^=ans*type;
		if(v<=limits){
			ans=query_min(x,y,x1,y1,v,k);
			cout<<ans<<'\n';
		}
		else{
			ans=query_max(x,y,x1,y1,v,k);
			cout<<ans<<'\n';
		}
	}
	return 0;
}

回复

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

正在加载回复...