題意
有一棵樹,大小爲,樹上每條邊都有邊權,可以是1,可以是0。現有對。
定義一個準路徑長度等於到之間的路徑和mod 2。現在問邊權值有多少種方案讓序列滿足非遞減( , )。
答案需要對取模。
分值 | 限制 | 子任務依賴 | |
---|---|---|---|
1 | 10 | ||
2 | 20 | 1 | |
3 | 70 | 2 |
題解
容易發現答案爲把一段前綴設爲(表示和相同),後面爲(表示和不同),這樣的合法種數(設最後一個的位置爲,合法種數即個數),問題在於如何求出合法種數。
暴力的做法是一條條連邊,用並查集維護每個點與祖先是否相同,連邊的同時判斷合法性。原本一直在想一條條把的邊換爲的邊,但這樣需要撤銷一條之前的邊再連上一條新邊,對並查集的影響難以維護。
發現上面的問題在於並查集僅能支持撤回剛加入的邊,而不能撤回之前的邊。對於直接從左往右考慮不好做的問題,應該考慮分治:對於當前區間,先把左半部分全部設爲,向右遞歸計算(即在右半邊)後撤回,然後把右半部分全部設爲(即在左半邊),向左遞歸計算後撤回。由於這樣保證撤回的都是剛加入的邊,用啓發式合併維護並查集回退即可,效率。