a. island
對於正負不同的情況,\(o(n)\) 列舉左側的位置然後計算。
對於正負性相同的情況,把笛卡爾樹建出來,然後每次考慮跨過最小值的貢獻。
分幾種情況:左右均不超過最小值,左右僅有乙個超過最小值,左右都超過最小值。
然後順便統計上其中乙個端點為劃分點的貢獻。然後瘋狂的寫式子拆式子就沒了。
做法挺簡單的,但是寫起來非常噁心。
b. river
容易想到乙個 \(o(nm)\) 的同餘系最短路。
然後可以發現乙個很好的性質是,這個玩意可以不斷花費時間 \(1\) 達到後乙個狀態。
這也就是說其實貪心的每次都走最短就行了。
所以預處理出 \(w_i\) 表示 \(time \equiv i \pmod m\) 的情況下花費的最小時間。
然後就可以 \(o(n)\) 做了,容易發現這個玩意是有環的,所以對於大環直接跳,剩餘的部分接著暴力,複雜度就是 \(o(m)\) 的了。
c. cac
大概可以想到圓方樹。然後圓方樹還就非常完美的吻合了這個題。
當只經過環上乙個點的時候,這個環上的其他點是不能產生貢獻的。
當經過環上超過乙個點,環上的所有點都要做一次貢獻。
然後經過環上超過乙個點就恰好對應著圓方樹中經過代表乙個環的方點。
所以我們把貢獻記在方點上,每次修改就把路徑上的所有方點累加權值。
每次詢問就查詢父親這個方點的權值和。
但是這樣做有一些小問題,\(lca\) 處有一些特殊的情況。
對於修改操作,若 \(lca\) 為圓點,那麼 \(lca\) 這個點應該也累加一次權值。
若 \(lca\) 為方點,那麼 \(lca\) 的父親這個圓點不能統計兒子的貢獻,所以給 \(lca\) 的父親累加一次權值。
考試的時候主要卡在了對於乙個圓點怎麼找到鄰接的所有方點的權值和。
但是這是乙個樹形結構,所以每個點僅有乙個父親,利用這個性質可以直接給父親累加權值。
省選模擬104 題解
a.簽到題 把每個點向它右側比他大的第乙個點之間連邊,如果沒有那麼向 root 連邊。那麼可以構成一棵樹。特判一些情況之後,可以認為問題就是 1.給某節點和它的所有兒子節點權值加上乙個值。2.詢問一條路徑的權值和。首先考慮如果只詢問單點的維護方法,其實就是打乙個標記表示給整個兒子集合都加上了若干權值...
省選模擬101 題解
a.石子遊戲 問題可以簡單轉化為最少能取出多少個數,使得異或和為 k 顯然答案是小於 log a i 的,因為線性基已經可以拼出所有數了。所以可以考慮列舉這個答案,然後就是 dp 表示用 i 個數能否拼出 j 轉移可以用 fwt 優化,暴力做就是兩個 log 的,因為只需要一項所以手動 ifwt 可...
省選模擬100 題解
a.小b的棋盤 這種方案不好列舉的題的乙個解決方案就是考慮怎樣的方案是可能合法的。如果 k geq n 那麼一定無解,否則可以找到至少一組點的中點來表示最終的答案。容易發現取 k 1 個點至少存在乙個能匹配到的,所以複雜度可以做到 o n 2 k 如果判斷一下每個中點出現的次數,可以做到 o n 2...