BZOJ 2054 瘋狂的饅頭

2022-09-06 17:30:17 字數 611 閱讀 5127

description

n個點,m次操作,每次把(i*p+q)%n+1與(i*q+p)%n+1之間的點染上顏色i,被染過色的會被新顏色覆蓋,求最後每個點的顏色。

【題解】

因為被染過的顏色會被新的顏色覆蓋,所以對於乙個點,有效的染色只是最後一次。

那麼我們可以倒著染色,已經染色的不染

求每個點被哪種區間覆蓋或者某個區間是否已經被覆蓋過都可以用並查集做。

我們把每個染過色的點都指向染色區間的右端點+1的位置,那麼下乙個沒被染色的點就是find(x)

如果乙個區間[l,r]滿足find(l)>=r+1,那麼這個區間已經被染色

#include#includeusing namespace std;

const int maxn=1000010;

int n,m,p,q,col[maxn],fa[maxn];

void read(int &k)

int find(int x)

int main()

} for (int i=1;i<=n;i++) printf("%d\n",col[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掉,所以需要乙個優化的演算法。由於求最後的染色,所以可以用並查集。怎麼用呢。從後往前列舉,如果...