BZOJ 2054 瘋狂的饅頭

2021-06-29 00:52:38 字數 809 閱讀 6197

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並查集。

(一看這道題認為是簡單的線段數打標記,但是資料範圍顯然不可以)

每個饅頭的顏色取決於最後染他的是什麼顏色,那麼我們倒著來處理染色。

可是如何判斷當前要染的區間是否在之前就被染過色了?

用並查集!!

f[i]表示i到f[i]-1這段區間已經被染過色了,那麼我們把i染過色之後,f[i]=i+1。

處理一段區間,只要一直順著f[i]染就可以了~

#include #include #include #include #define m 10000000+5

using namespace std;

int f[m],n,m,p,q,c[m];

int getfather(int x)

int main()

if (tot==n) break;

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

printf("%d\n",c[i]);

return 0;

}

感悟:1.re是因為沒有處理f[n]=n+1

2.並查集維護區間資訊~

bzoj 2054 瘋狂的饅頭

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

BZOJ2054瘋狂的饅頭

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

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並查集...