分块求调!调出来让同桌吃键盘
查看原帖
分块求调!调出来让同桌吃键盘
690160
ask_silently楼主2024/2/28 20:08
#include <bits/stdc++.h>
using namespace std;

const int N=1e6+10;

int bsz,bcnt,ans;
int a[N],bl[N],br[N],tag[N],bel[N],bsum[N];

long long n,m,p,q;

inline int read(){
	int t=0,f=1;
	register char c=getchar();
	while(c<'0'||c>'9') f=(c=='-')?(-1):(f),c=getchar();
	while(c>='0'&&c<='9') t=(t<<3)+(t<<1)+(c^48),c=getchar();
	return t*f;
}

inline long long readl(){
	long long t=0,f=1;
	register char c=getchar();
	while(c<'0'||c>'9') f=(c=='-')?(-1):(f),c=getchar();
	while(c>='0'&&c<='9') t=(t<<3)+(t<<1)+(c^48),c=getchar();
	return t*f;
}

void init(){
	bsz=sqrt((double)(n)),bcnt=ceil((double)(n)/bsz);
	for(int i=1;i<=bcnt;i++){
		bl[i]=(i-1)*bsz+1,br[i]=i*bsz;
		for(int j=bl[i];j<=br[i];j++) bel[j]=i; 
	}
}

void add(int x,int y,int z){
	if(bel[x]==bel[y]){
		if(tag[bel[x]]) return;
		for(int i=x;i<=y;i++){
			if(a[i]) continue;
			a[i]=z,bsum[bel[x]]++,ans++;
		}
		return;
	}
	for(int i=x;i<=br[bel[x]];i++){
		if(tag[bel[x]]) break;
		if(a[i]) continue;
		a[i]=z,bsum[bel[x]]++,ans++;
	}
	for(int i=bl[bel[y]];i<=y;i++){
		if(tag[bel[y]]) break;
		if(a[i]) continue;
		a[i]=z,bsum[bel[y]]++,ans++;
	}
	for(int i=bel[x]+1;i<bel[y];i++){
		if(tag[i]) continue;
		tag[i]=z,ans+=(br[i]-bl[i]+1)-bsum[i];
	}
}

int main(){
	n=readl(),m=readl(),p=readl(),q=readl();
	init();
	for(int i=m;i>=1;i--){
		int x=(int)((i*p+q)%n+1),y=(int)((i*q+p)%n+1);
		if(x>y) swap(x,y);
		add(x,y,i);
		if(ans==n){
			for(int j=1;j<=n;j++){
				if(a[j]) cout<<a[j]<<"\n";
				else if(tag[bel[j]]) cout<<tag[bel[j]]<<" ";
				else cout<<0<<"\n";
			}
			break;
		}
	}
	if(ans!=n){
		for(int j=1;j<=n;j++){
			if(a[j]) cout<<a[j]<<"\n";
			else if(tag[bel[j]]) cout<<tag[bel[j]]<<" ";
			else cout<<0<<"\n";
		}
	}
	return 0;
}

样例过了,但WK了 (炸)

2024/2/28 20:08
加载中...