BZOJ2504 瘋狂的饅頭 並查集題

2021-09-11 17:46:58 字數 1112 閱讀 6776

這個題是老師上課講的題,對我來說還能勉強接受,所以就寫了個解題報告。

好了,先看題:

input

四個正整數,n,m,p,q。

output

n行,第i行表示第i個饅頭的最終顏色

樣例輸入

4 3 2 4

樣例輸出22

30額,這個呢,就是用並查集倒過來做,先讀入,然後從m到1來染色,一開始我也沒有想到,因為倒過來做的話就可以肯定是最終顏色了,之後,我們再算區間(ip+q)%n+1及(iq+p)%n+!也就是l和r區間中,給沒有染色的饅頭染上色,然後將這個區間的被染色的饅頭的父親都指向下乙個饅頭,這樣下一次染色假如又染到被染過的饅頭(也就是下乙個區間裡又包含被用過的點的話)的話就可以直接跳過去,相信很多像我一樣的蒟蒻看到這裡都聽懵了,沒關係,好好想想其實可以勉強接受的,並竟我也是乙個並查集剛入門的蒟蒻,其實你只要不要想什麼(i*p+q)%n+1什麼的,只要隨便舉出幾個區間,畫一畫就能明白。

當然,如果不知道具體寫法的話,我可以在標程前給你們乙個具體模版:

for i=m;i>=1;i–

for(int ii=getfather(l);ii<=r;ii=getfather(i))

[ans[ii]=i;

fa[ii]=ii+1;

}以下是標程:

#include

#include

using namespace std;

int n,m,p,q,fa[

1000111

],ans[

1000111];

intget

(int x)

//並查集

void

ready()

//初始化。

}int

main()

}for

(int i=

1;i<=n;i++

)return0;

}

好了,如果不嫌棄的話,可以看看我準備寫的關於並查集虛點的部落格,當然因為我只是個入門,所以肯定也是十分經典而又蒟蒻(對你們這些神犇來說)的題。

並查集 bzoj2054 瘋狂的饅頭

因為只有最後被染上的顏色會造成影響,所以倒著處理,用並查集維護已經染色的區間的右端點,即fa i 為i所在的已染色區間的右端點,這樣可以保證o n 的複雜度。include includeusing namespace std define n 1000001 inline void p int x...

BZOJ 2054 瘋狂的饅頭

time limit 10 sec memory limit 162 mb submit 449 solved 175 submit status 第一行四個正整數n,m,p,q 一共輸出n行,第i行表示第i個饅頭的最終顏色 如果最終顏色是白色就輸出0 4 3 2 422 30並查集。一看這道題認為...

bzoj 2054 瘋狂的饅頭

想到了要用一種東西維護下乙個沒被染色的是什麼東西,但是沒想到是並查集。這道題就相當於在每乙個集合裡的數都會跳到乙個相同的點,就相當於並查集的代表元素。如果將乙個點染色,就把它的父親設為i 1,這樣並查集的代表元素就是下乙個沒有被染色的點。include include include include...