【BZOJ】2054: 疯狂的馒头
【题意】给定n个元素,m次给一段区间染色为i,求最终颜色。
【算法】并查集
【题解】因为一个点只受最后一次染色影响,所以倒过来每次将染色区间用并查集合并,父亲指向最右边的点。
细节:
1.fa[n+1]=n+1!!!界外点要赋值为自身!!!
2.swap(l,r),涉及双端点的题都要注意。
#include<cstdio> #include<algorithm> using namespace std; const int maxn=1000010; int n,m,p,q,fa[maxn],col[maxn]; int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);} int main(){ scanf("%d%d%d%d",&n,&m,&p,&q); for(int i=1;i<=n+1;i++)fa[i]=i;// int num=0; 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=find(l);j<=r;j=find(j)){ col[j]=i;fa[j]=j+1;num++; } if(num==n)break; } for(int i=1;i<=n;i++)printf("%d\n",col[i]); return 0; }