「柴門聞犬吠,風雪夜歸人」,冬天,不期而至。千里冰封,萬里雪飄。空中颳起了鴨毛大雪。雪花紛紛,降落人間。 美能量星球(pty 在 spore 上的乙個殖民地)上的人們被這美景所震撼。但是 pty 卻不高興,他不喜歡白色的世界,他覺得這樣太單調了。所以他想對雪花進行染色,讓世界變得多彩些。
現在有 n 片雪花排成一列。 pty 要對雪花進行 m 次染色操作,第 i次染色操作中,把第(i*p+q)%n+1 片雪花和第(i*q+p)%n+1 片雪花之間的雪花(包括端點)染成顏色 i。其中 p,q 是給定的兩個正整數。他想知道最後 n 片雪花被染成了什麼顏色。
輸入格式:
包含 4 行:
n m p q 意義如題中所述。
輸出格式:
包含 n 行:
第 i 行表示第 i 片雪花被染成的顏色 c
輸入樣例#1:
複製
4324
輸出樣例#1:
複製
2230
20%的資料滿足:1<=n,m<=1000
40%的資料滿足:1<=n<=8000,1<=m<=1000000
80%的資料滿足:1<=n<=500000,1<=m<=10000000
100%的資料滿足:1<=n<=1000000,1<=m<=10000000
保證 1<=m*p+q,m*q+p<=2*10^9
並查集維護染色問題經典題目
倒序處理
//luogu-judger-enable-o2
//luogu-judger-enable-o2
#include//
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?eof:*p1++)
using
namespace
std;
const
int maxn=1e6+10
;const
int inf=1e9+10;//
char buf[1<<20],*p1=buf,*p2=buf;
inline int
read()
while(c>='
0'&&c<='9')
return x*f;
}int
color[maxn];
intfa[maxn];
int find(int
x)int
main()
for(int i=1;i<=n;i++)
printf(
"%d\n
",color[i]);
return0;
}
P2391 白雪皚皚
miku 顯然思路是倒著掃,倒著染。然而這樣有乙個問題,這樣做,那麼對於已經染色的區間是不需要重新染色的,但是遍歷的時候可以找到已染色區間的乙個端點,另乙個在哪?用並查集解決 fa x 為x右邊第乙個沒染色的端點 然後就o n 解決了 fa n 1 0,那麼就可以愉快的爆棧 15分了 include...
洛谷 P2391 白雪皚皚 線段樹 優化
現在有 n 片雪花排成一列。pty 要對雪花進行 m 次染色操作,第 i 次染色操作中,把 i p q n 1 片雪花和第 i q p n 1 片雪花之間的雪花 包括端點 染成顏色 i 其中 p q 是給定的兩個正整數。他想知道最後 n 片雪花被染成了什麼顏色。輸入格式 包含 4 行 n m p q...
洛谷p1525 並查集
先將最大的犯罪都找出來然後將人員分組 假設兩人x,y 如果x 前面已經有過敵人了 那就將y合併到x的敵人裡去 y也是如此若有 將x合併到y的敵人去 如果x 和 y前面都沒有 那麼互相將彼此設為敵人 直到找到矛盾的 就是 xy有同乙個敵人 include include include using n...