BZOJ2054瘋狂的饅頭

2021-07-10 02:12:11 字數 985 閱讀 9931

2054: 瘋狂的饅頭

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

output

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

首先考慮資料範圍,區間修改的話用線段樹對於10^7的資料肯定會t掉,所以需要乙個優化的演算法。。

由於求最後的染色,所以可以用並查集。。

怎麼用呢。。

從後往前列舉,如果這個點已經被染過色了,那麼下面的操作便不需要染色了。。

這樣每個點就會只染色一次。。

就在並查集中將這個點連向右面那個。。

時間複雜度o(n+m)。。

附上本蒟蒻的**:

#include

#include

using namespace std;

int father[10000002],a[1000001];

intread()

return w;

}int find(int f)//這裡要寫遞迴的路徑壓縮

int main()

}for (i=1;i<=n;i++)

printf("%d\n",a[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 瘋狂的饅頭

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