P2391 白雪皑皑

倒序处理,并查集维护连续性。

#include<cstdio>
#include<iostream>
using namespace std;
const int N=10000005;
int n,m,p,q;
int color[N],f[N];
int find(int x){
	if(x==f[x]) return x;
	return f[x]=find(f[x]);
}
int main(){
	scanf("%d%d%d%d",&n,&m,&p,&q);
	for(int i=1;i<=n;i++) f[i]=i;
	for(int i=m;i>=1;i--){
		int l=(i*p+q)%n+1,r=(i*q+p)%n+1;
		if(l>r) swap(l,r);
		for(int j=r;j>=l;){
			int xx=find(j);
			if(xx==j){
				color[j]=i;
				f[j]=find(xx-1);
			}
			j=f[j];
		}
	}
	for(int i=1;i<=n;i++) printf("%d
",color[i]);
	return 0;
}
原文地址:https://www.cnblogs.com/New-ljx/p/15256861.html