2021.11.14貓貓模擬賽3
前言
題解
senpai
列舉字首長度 \(s\),滿足條件當且僅當 \((\sum_{i=1}^si^2-n)/2\) 可以表示為不大於 \(s^2\) 的平方數之和。
歸納可以得出 \(\forall n\ge 13\),\([129,129+n^2)\) 可以寫成不大於 \(n^2\) 的平方數之和。
所以對 \(s\le 12\) 的部分暴力跑揹包,\(s>12\) 的時候,若 \((\sum_{i=1}^si^2-n)/2\) 太大那麼顯然可以,否則根據之前揹包的結果可以求出。
hamil
容易發現最優解路徑的點數是 \(n\),構造就用雙向連結串列維護,記錄顏色交替的頂點 \(p\)
時間複雜度 \(O(n^2)\)。
perm
顯然 \(f\) 不升,\(f_1=n\),\(f_n=1\),否則無解。
考慮從小到大放數,設現在要放 \(p(<n)\),\(f_k>p\),\(f_{k+1}\le p\)
對這個條件 dp,發現連續空位段之間的順序沒有關係,複雜度就是劃分數級別的。
sum
容易發現 \(g\) 會有一堆一大段相同,所以轉置一下,考慮求 \(c(x)\) 表示使所有子段和 \(\le x\) 的最小操作次數。
設 \(p_i\) 表示對 \(1,2,\cdots,i\) 的操作次數之和,則 \(p_i\ge p_{i-1}\),\(p_j-p_i\ge\sum_{k=i+1}^ja_i-x\pod{i<j}\),要讓 \(p_n\) 儘量小。
這是一個差分約束形式,最暴力的方法就是造一個有向圖跑最長路:
- \(i\rightarrow j\) 連權值為 \(\sum_{k=i}^{j-1}a_k-x\) 的邊(\(1\le i<j\le n+1\))
- \(i\rightarrow i+1\) 連權值為 \(0\) 的邊(\(1\le i\le n\))
然後就可以看出來 \(c(x)=\max_k(t_k-xk)\),其中 \(t_k\) 表示 \(k\) 個互不相交的段的和最大值,這個是經典問題。
隨著 \(x\) 減少取到最大值的 \(k\) 也是增加的,所以拿這一堆直線切出的就是一個凸包。
最後求答案的時候把詢問離線下來,分界點就是 \(t_{k+1}-t_k\),左開右閉的每一段是一堆線段形成等差數列的形式,最後剩下的散塊要特判。
時間複雜度 \(O((n+q)\log n)\)。