對於每個點,只有最後一次染色是有意義的,所以我們倒著染色,然後乙個點染完了我們就把他指向他後邊第乙個沒被染過的點,然後每次沿著指標往後跳,用並查集優化這個過程,複雜度o(n)
#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define maxn 1000010
#define maxm 1010
#define inf 1000000000
#define mod 1000000007
#define eps 1e-8
#define ll long long
int n,m,p,q;
int f[maxn];
int c[maxn];
int fa(int x)
int main()
for(i=m;i;i--)
for(j=l;j<=r;j++)else
} }for(i=1;i<=n;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掉,所以需要乙個優化的演算法。由於求最後的染色,所以可以用並查集。怎麼用呢。從後往前列舉,如果...