WC 2005 dface 雙面棋盤

2021-06-04 02:40:35 字數 899 閱讀 4597

其實就是個線段樹+並查集維護,原來的每行看做線段樹的乙個底層節點,線段樹每個節點2*n的空間建立乙個並查集,兩個節點合併時維護塊的個數資訊,然後捨棄中間部分保留外圍部分重建並查集就可以了。

我寫的是zkw線段樹,用這方法就算不是黑白雙色也可以的吧。

本人弱菜。

#include#include#include#includeint sum[517][5],a[517][517],ll[517],rr[517],f[517][805];

int n=0,mm=0,tot=0;

int find(int s,int x)//在s號並查集中find和路壓

void search(int p,int s)//底層節點特別維護

}}void merge(int s,int l,int r)//合併兩個節點l,r。資訊傳給s

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

if (a[rr[l]][i]==a[ll[r]][i])

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

f[s][i]=find(s,i);

}else

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

if (a[rr[l]][i]==a[ll[r]][i])

}//以下為重建並查集

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

}int main()

mm=1<<(int)(log2(n)+1);

if (mm<=n) mm<<=1;

for (i=0;i=1;i--)

merge(i,i<<1,(i<<1)+1);

int m=0;

scanf("%d\n",&m);

for (;m>0;m--)

return 0;

}

P4121 WC2005 雙面棋盤

p4121 wc2005 雙面棋盤 貌似是劉汝佳出的題目?線段樹維護並查集 線段樹分治 1 n 行,我們要考慮維護的肯定是黑 白各自的聯通塊數量 考慮區間合併,其實就與中間這兩層有關,n 200 並查集暴力做一下就好了 include include include include includeu...

WC2005 雙面棋盤 並查集 分治

題目描述 題解 唉,還是碼力不行,寫了乙個多小時發現想錯了又重構了乙個多小時。這道題意圖很顯然,動態維護聯通塊,有乙個經典做法就是用lct維護按照刪除時間維護的最大生成樹。網上還有一種神奇的做法,線段樹套並查集,蒟蒻表示不懂。這道題可以利用並查集操作可以撤銷這種性質來做。線段樹分治 線段樹分治可以分...

WC2005 友好的生物

這題算是毒瘤吧,看到這個題我除了o n 2 想不到別的方法 後來嘗試使用平方的方式亂搞,但是給出了反例 在看了國家集訓隊ysy的解題報告後方才明白 思路是一種放寬的思路 我們列舉每個差值的符號,在其中列舉最大值,就可以有效去除絕對值 最後按照第k位從小到大排序,來列舉 從小到大進行掃瞄,每次用當前的...