bzoj2054 瘋狂的饅頭

2022-03-06 21:54:35 字數 640 閱讀 2693

第一行四個正整數n,m,p,q

一共輸出n行,第i行表示第i個饅頭的最終顏色(如果最終顏色是白色就輸出0)。

4 3 2 4
223

0

本題要求求最後的顏色,我們很容易就可以想到暴力,即順序染色,每一次覆蓋一段區間,但是毫無疑問,對於本題的大資料必然超時。超時的關鍵在於我們每次都重複染色乙個區間的每乙個饅頭,所以我們用並查集來優化,倒序染色,用\(f[i]\)來記錄\(i\)的父節點,即i後面的第乙個沒有被染色的饅頭的位置,每次染色直接指向每有被染色的饅頭位置,這樣我們就避免了不必要的染色,從而效率大幅度提高。

#include#includeusing namespace std;

const int n=1000001;

int f[n],c[n];

int find(int x)

int main()

for(int i=1;i<=n;++i) printf("%d\n",c[i]);

return 0;

}

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

BZOJ2054瘋狂的饅頭

2054 瘋狂的饅頭 第一行四個正整數n,m,p,q output 一共輸出n行,第i行表示第i個饅頭的最終顏色 如果最終顏色是白色就輸出0 首先考慮資料範圍,區間修改的話用線段樹對於10 7的資料肯定會t掉,所以需要乙個優化的演算法。由於求最後的染色,所以可以用並查集。怎麼用呢。從後往前列舉,如果...