小Z的梦 并查集
問題描述
小Z做了一個夢,夢中他終于得到了夢寐以求的德國牧羊犬,而且有好多只,小Z數了一下一共有N只,但不幸的是所有牧羊犬竟然都是白色的,小Z最不喜歡白色。于是他讓所有牧羊犬排成一排,準備對它們進行M次染色操作。每次他將連續的多個牧羊犬染成特定的某種顏色。一個牧羊犬最終的顏色是最后一次被染的顏色。如果某個牧羊犬沒有被染過色,那么它的顏色就是白色。
小Z決定采用下面的方法染色:在第i次染色操作中,把包括第(i×A+B)ModN+1和(i×B+A)ModN+1
之間的所有牧羊犬染成顏色i,其中A,B是特定的兩個正整數。他想立刻知道最后每個牧羊犬的顏色。
輸入格式
第一行四個正整數N,M,A,B
輸出格式
一共輸出N行,第i行表示第i個牧羊犬的最終顏色(如果最終顏色是白色就輸出0)。
輸入樣例
4 3 2 4輸出樣例
2 2 3 0限制與約定
1≤N≤1000000,1≤M≤10000000
1≤M×A+B,M×A+B≤231?1
時間限制:5s
空間限制:128MB
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> using namespace std; const int maxn = 1000000 + 10 ; int f[maxn],ans[maxn]; int find(int x) {if( !f[x] || f[x]==x ) return f[x]=x;return f[x]=find(f[x]); } int main() {int n,m,a,b;cin>>n>>m>>a>>b; // for(int i=1;i<=n;i++) f[n]=i;for(int i=m;i;i--){int l=(i*a+b)%n+1;int r=(i*b+a)%n+1;if(l>r) swap(l,r);for(int j=find(l);j<=r;j=find(j)){ans[j]=i;f[j]=j+1;}}for(int i=1;i<=n;i++)printf("%d\n",ans[i]);return 0; }?
轉載于:https://www.cnblogs.com/hfang/p/11240006.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結