DTOJ 4878. 零一樹

題意

有一棵樹,大小爲nn,樹上每條邊都有邊權,可以是1,可以是0。現有mmui,vi(uivi,1ui,vin)u_i,v_i(u_i \neq v_i, 1\leq u_i,v_i \leq n)

定義一個準路徑長度pip_i等於uiu_iviv_i之間的路徑和mod 2。現在問邊權值有多少種方案讓pip_i序列滿足非遞減(pipi+1p_i \leq p_{i+1} , 1i<m1 \leq i < m)。

答案需要對998244353998 244 353取模。

分值 限制 子任務依賴
1 10 2n,m102 \leq n,m \leq 10
2 20 2n,m20002 \leq n,m \leq 2000 1
3 70 2n,m2500002 \leq n,m \leq 250000 2

題解

容易發現答案爲把一段前綴設爲00(表示uiu_iviv_i相同),後面爲11(表示uiu_iviv_i不同),這樣的合法種數(設最後一個00的位置爲psps,合法種數即psps個數)21*2^{連通塊個數-1},問題在於如何求出合法種數。

暴力的做法是一條條連邊,用並查集維護每個點與祖先是否相同,連邊的同時判斷合法性。原本一直在想一條條把00的邊換爲11的邊,但這樣需要撤銷一條之前的邊再連上一條新邊,對並查集的影響難以維護。

發現上面的問題在於並查集僅能支持撤回剛加入的邊,而不能撤回之前的邊。對於直接從左往右考慮不好做的問題,應該考慮分治:對於當前區間,先把左半部分全部設爲00,向右遞歸計算(即psps在右半邊)後撤回,然後把右半部分全部設爲11(即psps在左半邊),向左遞歸計算後撤回。由於這樣保證撤回的都是剛加入的邊,用啓發式合併維護並查集回退即可,效率O(nlog2n)O(nlog^2n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章