[BZOJ2054]疯狂的馒头

 

寒假zrt讲过,用并查集维护这个点往后最近的白色馒头是谁,然后时光倒流,直接往它的fa处跳就行了。

 

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=1000005;
int fa[N],n,m,p,q,c[N];
int find(int x) {return x==fa[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;
    for(int i=m;i;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+1)) c[j]=i,fa[j]=find(j+1);
    }
    for(int i=1;i<=n;i++) printf("%d\n",c[i]);
}
疯狂的馒头

 

posted @ 2018-10-03 18:44  SWHsz  阅读(125)  评论(0编辑  收藏  举报