只有最后一次染色有效,时光倒流,用并查集保证每个点只被染一次,染够n次及时退出,复杂度O(n)
#include<iostream> #include<cstdio> using namespace std; inline int rd(){ int ret=0,f=1;char c; while(c=getchar(),!isdigit(c))f=c=='-'?-1:1; while(isdigit(c))ret=ret*10+c-'0',c=getchar(); return ret*f; } const int MAXN=1000005; int fa[MAXN],color[MAXN]; int n,m,p,q; int fnd(int x){ return x==fa[x]?x:fa[x]=fnd(fa[x]); } int cat(int x,int y){ x=fnd(x);y=fnd(y); fa[x]=y; } int main(){ n=rd();m=rd();p=rd();q=rd(); int cnt=0; for(int i=1;i<=n+1;i++)fa[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=fnd(l);j<=r;j=fa[j]){ cnt++; color[j]=i;cat(j,j+1); if(cnt==n) break; } } for(int i=1;i<=n;i++){ printf("%d ",color[i]); } return 0; }