【bzoj2054】疯狂的馒头

来源:互联网 发布:shooter 海军网络 编辑:程序博客网 时间:2024/06/02 20:29

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<bits/stdc++.h>typedef long long ll;const int mod=1000000007;const int N=500005;using namespace std;inline int read(){    int x=0,f=1;char ch=getchar();    while (ch<'0'||ch>'9'){if (ch=='-')f=-1;ch=getchar();}    while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}int n,m,p,q,f[1000005],ans[1000005];int find(int i){    if (f[i]!=i) f[i]=find(f[i]);    return f[i];}int main(){    n=read();m=read();p=read();q=read();    for (int i=1;i<=n+1;i++) f[i]=i;    for (int i=m;i;i--)    {        int x=((ll)i*p+q)%n+1;        int y=((ll)i*q+p)%n+1;        if (x>y) swap(x,y);        for (int j=find(x);j<=y;j=find(j)){ans[j]=i;f[j]=j+1;}    }    for (int i=1;i<=n;i++) printf("%d\n",ans[i]);    return 0;}