省選模擬71 題解

2022-03-16 18:34:35 字數 1433 閱讀 3550

這個資料範圍加上很奇怪的限制,其實就應該是網路流了。

可以首先欽定選擇了 $a$ 類,然後將其中的一些替換為 $b$ 類。

其實與志願者招募那個題挺像的,只不過原來是對於每個點選擇 $[l,r]$ 個區間。

但是現在的問題是要求每個區間選擇 $[l,r]$ 個數點。

其實並不難處理,將 $n-k+1$ 個區間視作 $n-k+2$ 個連成一條鏈的點之間的邊即可。

這樣每個點能造成的貢獻其實就是一段連續區間,與志願者招募一題很像了。

但是還有乙個問題是,在本題中要求最大的收益,但是直接建圖是存在正環的。

所以這個最大費用流就沒得跑了。

考慮這樣乙個事情,一般的上下界網路流是欽定下界,然後去流上界-下界。

其實另一種做法是欽定上界,建反向邊同樣流上界-下界表示退流。

這樣的話其實可以結合兩種做法,只建負邊權的邊就可以解決這個問題。

這個題的 $n^2$ 做法是顯然的,然後發現 $n \leq 30000$ 而且時限還開了 $3s$。

那直接打個暴力,順便卡卡常就結束了。

正解是考慮給每種數隨機乙個權值,然後區間 $[l,r]$ 成為答案僅當 $sum_r \oplus sum_ \oplus s_=0$。

其中 $sum_i$ 表示字首異或和,$s_$ 表示 $[l,r]$ 區間內出現的數的異或和。

容易發現這是乙個 $0/1\ trie$ 樹問題,然後難點在於維護後者。

考慮每次移動右端點,更新可以更新的 $s_$,這是一段連續的區間並且左端點是容易找到的。

所以分塊維護這個 $0/1 \ tire$ 樹,每次打個標記就好了。

顯然這個問題要用 ac 自動機解決,然後發現不會做。

看資料範圍,有乙個很奇妙的性質是點數 $\leq 50$。

加上迴圈這個玩意,就可以聯想到這個東西一定是存在迴圈節的。

假設當前 $str$ 的長度為 $len$,那迴圈節的長度一定不超過 $50*len$。

所以暴力找迴圈節是可以接受的。

部分分提示了一些東西,比如可以用乙個珂朵莉樹來維護字串 $s$。

點數 $\leq 50$是乙個很好的東西,還有乙個可以挖掘到的性質是 tire 樹的深度是 $\leq 50$的。

因為 ac 自動機維護的是字尾,那也就是說對於每次我們只關注每個點的前 $50$ 個字元就足以得到當前狀態。

考慮維護乙個陣列 $f$, $f_i$ 表示把 $s[1:i]$ 丟到自動機上匹配,得到的以 $r$ 為右端點的子串個數。

對於每次修改,只需要考慮迴圈節、迴圈節之前的部分、 $r$ 之後的不超過 $50$ 個字元。

對於迴圈節內的部分,用線段樹區間覆蓋即可維護。另外兩者可以直接暴力。

對於每次詢問,只需要將 $[l,r]$ 拆分為 $[l,l+50]$ 和 $[l+51,r]$。

前者長度很小,可以暴力維護。後者已經與左端點 $l$ 無關了,所以可以直接用 $f$ 陣列,所以這題就做完了。

省選模擬104 題解

a.簽到題 把每個點向它右側比他大的第乙個點之間連邊,如果沒有那麼向 root 連邊。那麼可以構成一棵樹。特判一些情況之後,可以認為問題就是 1.給某節點和它的所有兒子節點權值加上乙個值。2.詢問一條路徑的權值和。首先考慮如果只詢問單點的維護方法,其實就是打乙個標記表示給整個兒子集合都加上了若干權值...

省選模擬102 題解

a.island 對於正負不同的情況,o n 列舉左側的位置然後計算。對於正負性相同的情況,把笛卡爾樹建出來,然後每次考慮跨過最小值的貢獻。分幾種情況 左右均不超過最小值,左右僅有乙個超過最小值,左右都超過最小值。然後順便統計上其中乙個端點為劃分點的貢獻。然後瘋狂的寫式子拆式子就沒了。做法挺簡單的,...

省選模擬101 題解

a.石子遊戲 問題可以簡單轉化為最少能取出多少個數,使得異或和為 k 顯然答案是小於 log a i 的,因為線性基已經可以拼出所有數了。所以可以考慮列舉這個答案,然後就是 dp 表示用 i 個數能否拼出 j 轉移可以用 fwt 優化,暴力做就是兩個 log 的,因為只需要一項所以手動 ifwt 可...