Description
Solution
容易发现颜色只跟最后一次染有关。因为线段树显然会T,考虑离线询问倒着做
像链表一样记录每个位置往右第一个没涂颜色的位置,然后这个可以用并查集维护,然后每个点只会被染色一次,然后就做完了
Code
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
#define drp(i,st,ed) for (int i=st;i>=ed;--i)
typedef long long LL;
const int N=10000005;
int fa[N],c[N];
int read() {
int x=0,v=1; char ch=getchar();
for (;ch<'0'||ch>'9';v=(ch=='-')?(-1):(v),ch=getchar());
for (;ch<='9'&&ch>='0';x=x*10+ch-'0',ch=getchar());
return x*v;
}
int get_father(int x) {
if (!fa[x]) return x;
return fa[x]=get_father(fa[x]);
}
int main(void) {
int n=read(),m=read(),p=read(),q=read();
drp(i,m,1) {
LL x=(p*i+q)%n+1,y=(q*i+p)%n+1;
if (x>y) std:: swap(x,y);
for (int j=get_father(x);j<=y;j=get_father(j)) {
c[j]=i;
fa[j]=j+1;
}
}
rep(i,1,n) printf("%d\n", c[i]);
return 0;
}