基礎卷積練習題
看上去\(\max\)的限制不好處理。
但是題目中\(a,b\)都特別小。
考慮列舉\(a,b\)的值為\(x,y\),新建兩個陣列\(c,d\),當\(a_i=x,b_i=y\),\(c_i,d_i\)賦值為\(1\)。
把\(c,d\)作or卷積,\(>0\)的部分對\(f(x,y)\)取\(\max\)貢獻到答案。
時間複雜度\(o(2^nn^3)\)。
或者把fwt的域擴充套件一下。就像在一些題目中,拓展行列式的域求多項式一樣。使用乙個長度為\(m\)的向量儲存結果。
時間複雜度\(o(2^nn^2)\)。
小ω的樹
由於題目沒有修改邊權,考慮kruskal重構樹。
考慮每條邊的貢獻,由於點權非負,顯然要選擇盡可能多的點。
欽定一條邊產生貢獻,能選擇的點是這條邊對應子樹的點。顯然選擇整顆子樹更優。
現在,我們要支援修改。
也就是對樹上的一條鏈的權值作加法。
鏈的情況是個經典問題。就是cf1178g的\(n\sqrt\log_2n\)演算法。
樹的情況考慮輕-重鏈剖分。
把每條重鏈分塊套用cf1178g的演算法。
看上去時間複雜度會多log。
然而由於每條重鏈的長度\(\leq\)鏈頂子樹的大小。
假設子樹的大小為\(s\)。
由於輕兒子的子樹大小\(\leq \cfrac\),所以修改的時間複雜度不會超過\(\sqrt\log_2n+\sqrt}\log_2n+\sqrt}\log_2n....=\sqrt\log_2n\)
所以這樣子的時間複雜度還是\(o((n+q)\sqrt\log_2n)\)的,十分神奇。
實際上,可以套用ynoi某題的可加負數做法做到\(o((n+q)\sqrt)\),但是沒有必要。
方格問題
殭屍注意到每個殭屍占領的肯定是乙個連通塊。(kruskal重構樹上的乙個子樹)
並且在乙個連通塊內,能力值大的殭屍的連通塊肯定包含能力值小的殭屍的連通塊。
這給了我們一些啟示。
設\(f_\)表示\(x\)所在連通塊中能力值最大殭屍為\(x\)。
如果能力值最大的殭屍多於\(1\)個,則欽定編號最大的殭屍能力值最大。
考慮從子樹\(y\)的\(f_\)轉移到當前點。
考慮:1.\(x\)和\(y\)在乙個連通塊內。
則\(i=j\)
\(f_*\)(殭屍\(x\)經過\(i\to j\)的方案數)\(\to f_\)。
2.\(x\)和\(y\)不在乙個連通塊內
2.1 \(j>i\)
則殭屍\(y\)必須不能進入\(x\)。
實際上,如果上面的條件滿足,則也蘊含了殭屍\(x\)不能進入到\(y\)這個限制。
\(f_*\)(殭屍\(y\)不經過經過\(i\to j\)的方案數)\(\to f_\)。
並且保證\(y\)中存在\(j\),不存在\(i\),這是因為\(y\to x\)的邊被斷開。
2.2 \(j同理可得
\(f_*\)(殭屍\(x\)不經過經過\(i\to j\)的方案數)\(\to f_\)。
初值是\(f_\)=[\(x>=i\)處最大的殭屍能力值]
注意字首和優化。
f由於其他求逆序對的做法不適合,考慮創造乙個新的求逆序對的做法。
考慮按位分治的套路。設\(solve(s,i)\)表示處理到\(s\)集合的第\(i\)位貢獻的逆序對的個數。
考慮按順序掃瞄\(s\)中的元素。然後問題轉換成對\(0/1\)序列求逆序對。可以儲存前面\(0/1\)個數解決。
設\(a_i\)表示第\(i\)位貢獻的順序對的個數,\(b_i\)表示第\(i\)位貢獻的逆序對個數。
注意到對乙個位進行\(xor\),等於把乙個位置的貢獻從\(a\)變成\(b\)。
所以題目要我們求出的就是若干個元素\(c_i\),每個可以取值為\(a_i\)或者\(b_i\),詢問取值的和排序後的第\(x\)個元素。
由於位數較少,考慮折半。
考慮二分第\(k\)位的值\(md\),顯然把左/右邊的所有情況排序,維護乙個指標就能求出\(\leq k\)的情況的個數。
對於第二問,求出值\(\leq md-1\)的數的個數,然後把\(p\)減去這個數。
然後我們要求的就是逆序對\(=md\)的值從小到大的第\(p\)位。
這同樣可以折半。
把左邊的值按照\(x\)從小到大排序,在右邊求出值等於某個數的數的個數,可以倍增/二分求出。
這樣子就成功求出了答案。
融入社會的計畫
考慮簡單dp,設\(f_\)表示考慮前\(x\)個位置,第\(x\)個位置改成\(i\)。
則\(f_+x-a_\to f_,l-j\leq x\leq r-j\)。
對\(f\)打表/分析/猜結論可以得到\(0\leq f_-f_\leq 1\)
考慮歸納證明,在第一步,隨著\(j\)的增大,乙個點能夠轉移到的區間的左右端點都會向左移動。
能夠轉移到\(x\)的\(j\)滿足\(l-x\leq j\leq r-x\),就是\(f_\)
考慮\(f_-f_=f_-f_+x-a_-(x-1-a_)=f_-f_+1\)
基礎fake練習題
考慮題目的線性規劃。
雖然題目有\(0\leq x\leq 1\)的限制,但是可以把它拆成\(0 \leq x\)和\(x\leq 1\)的兩個限制。
寫出這個線性規劃的對偶形式
得到如下問題:
1.刪除乙個路徑,代價為\(1\)
2.刪掉覆蓋第\(i\)個點的所有路徑,代價為\(c_i\)。
考慮dp。設\(f_\)表示第\(i\)個點,子樹中未被刪除的路徑的較淺點深度\(\leq j\)的最小代價。
假設根節點的深度是\(1\),顯然答案是\(f_\)。
顯然這個函式是常值分段函式,且隨著\(j\)的增加而增加。
用線段樹維護差分表。
顯然當堆的大小\(>c_i\)時,刪掉覆蓋第\(i\)個點的路徑更優。
所以我們每次刪除較淺點較淺的路徑即可。
god knows
悶聲刷大題
gdkoi2018 還唸
城市建設
顯然有線段樹分治+lct做法,但是並不是正解。
對詢問進行分治。
注意到當前區間\([l,r]\)的邊都是未被確定的,所以我們考
慮使用詢問外的邊更新當前的答案。
考慮從當前區間轉移到子區間。
把當前子區間內的所有邊的邊權設為\(-\inf\)然後和當前詢問外縮過的mst一起做mst。
則顯然權值不是\(-\inf\)且在當前mst的邊一定會被選擇。
可以把這些邊縮成乙個點。
把當前子區間內的所有邊的邊權設為\(\inf\)然後和當前詢問外縮過的mst一起做mst。
則顯然權值不是\(\inf\)且不在當前mst的邊一定不會被選擇。
可以刪除這些邊。
使用可撤銷並查集維護。每做完乙個區間就把它的修改全部撤銷。
並不會證明時間複雜度。
黑箱
聯賽聯考3
策略總結 這次策略有明顯問題。對於程式的檢測沒有積極性,於是掛的很慘 d1 t1,咋一看好像很水,直接按第一印象5分鐘寫了出來。過了樣例也沒想去拍,其實連思路都是錯的。t2感覺狀態有點模糊,直接去t3了。t3想出了5維狀態,結果腦子抽了用記憶化搜尋實現,n 5不能直接開出陣列。於是用map記憶化,結...
多校聯賽總結
首先是一些資料 2014 multi university training contest 1 by fzu a 數學 費馬小定理 b 網路流 最小k路徑覆蓋 c 樹形dp 樹的重心 資料結構 d 貪心 巧妙 e 數學 dp 隱含馬爾科夫模型 f 線段樹 函式式 二分 g 線段樹 狀態壓縮 h 模...
多校聯賽 Envy
我們讓 n 個人站成一排,編號為 1 n,每個人都有乙個數字代表他這次比賽的成績,對於每個人,如果他後面 編號大於他的人中 存在乙個人的成績大於等於他,那麼他的嫉妒值為他們之間的距離。兩個點 a和 b 之間的距離為 abs a b 例如 4,3,6,2 那麼第 1 個人對第 3 個人有 2 點嫉妒值...