【BZOJ2054】疯狂的馒头

来源:互联网 发布:java项目打包成jar包 编辑:程序博客网 时间:2024/05/16 00:40

Description

Input

第一行四个正整数N,M,p,q

Output

一共输出N行,第i行表示第i个馒头的最终颜色(如果最终颜色是白色就输出0)。

Sample Input

4 3 2 4

Sample Output

2
2
3
0

HINT

题解

由于染色是按最后一次的算,所以要从后往前处理,由于染完色后具有相同的性质,也就是可以用并查集维护,把一段的父亲设为最右边的就行了。
总结:并查集应用很广,主要是维护性质相同的东西,比如联通块。还有一个应用就是可以找联通块的个数。
/*  并查集 */#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N=10001010;int fa[N],a[N];int n,m,p,q,x,y;int find(int x){    if(x==fa[x]) return x;    return fa[x]=find(fa[x]);}int main(){    scanf("%d%d%d%d",&n,&m,&p,&q);         for(int i=1;i<=n*2;i++) fa[i]=i;    for(int i=m;i>=1;i--){        x=((long long)(i*p)+q)%n+1;        y=((long long)(i*q)+p)%n+1;                 if(x>y) swap(x,y);                 for(int j=find(x);j<=y;j=find(j))        a[j]=i,fa[j]=j+1;    }    for(int i=1;i<=n;i++)    printf("%d\n",a[i]);     return 0;}

阅读全文
1 0