bzoj2054 疯狂的馒头

时间:2023-03-09 05:19:09
bzoj2054 疯狂的馒头

bzoj上现在找不到这题,所以目前只是过了样例,没有测

2054: 疯狂的馒头

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 715  Solved: 298

Description

bzoj2054 疯狂的馒头

Input

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

Output

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

Sample Input

4 3 2 4

Sample Output

2
2
3
0

HINT

bzoj2054 疯狂的馒头

用并查集维护当前馒头之后第一个白馒头的位置,初始f[x]=x

倒着处理,这样一个馒头只会染一次。

详见代码

 /*by SilverN*/
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int mxn=;
int f[mxn];
int co[mxn];
int n,m,p,q;
int find(int x){
return f[x]==x? x:x=find(f[x]);
}
int main(){
int i,j;
scanf("%d%d%d%d",&n,&m,&p,&q);
for(i=;i<=n;i++)f[i]=i;
for(i=m;i>=;i--){
int s=(i*p+q)%n+;//边界
int t=(i*q+p)%n+;
if(s>t)swap(s,t);
for(j=find(s);j<=t;j=find(j)){
co[j]=i;
f[j]=j+;
}
}
for(i=;i<=n;i++){
printf("%d\n",co[i]);
}
return ;
}