【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;
}
View Code

 

posted @ 2017-10-10 21:10  ONION_CYC  阅读(332)  评论(0编辑  收藏  举报