bzoj2054 瘋狂的饅頭

2021-07-13 11:25:04 字數 927 閱讀 1988

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並查集將操作倒著處理,相當於每個饅頭至多被染一次,每次只會染到空白的饅頭。

用並查集維護每個饅頭後面第乙個白饅頭(包括自己),然後每次染色暴力染區間內所有空饅頭,同時把染了色的饅頭的集合和後面乙個的集合進行合併。

和bzoj4551類似,用並查集維護離自己最近的滿足某種性質的位置,然後每次修改後和後面乙個合併,這種思路很好。

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

#include#include#include#include#include#include#define f(i,j,n) for(int i=j;i<=n;i++)

#define d(i,j,n) for(int i=j;i>=n;i--)

#define ll long long

#define n 1000005

#define m 10000005

using namespace std;

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

inline int read()

while (ch>='0'&&ch<='9')

return x*f;

}inline int find(int x)

int main()

f(i,1,n) 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瘋狂的饅頭

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