洛谷P2391 白雪皚皚 並查集

2021-09-07 17:39:54 字數 1399 閱讀 2529

「柴門聞犬吠,風雪夜歸人」,冬天,不期而至。千里冰封,萬里雪飄。空中颳起了鴨毛大雪。雪花紛紛,降落人間。 美能量星球(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: 

複製

432

4

輸出樣例#1: 

複製

223

0

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...