[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]); }
我是咸鱼。转载博客请征得博主同意Orz