D. Arrays and Palindrome
如果兩個字元要求相同就給它們連邊,對於一個長度為 \(x\) 的迴文串,\(x\) 是偶數會連 \(x/2\) 條邊,奇數會連 \(x/2 - 0.5\) 條邊。
\(a\) 和 \(b\) 兩個序列總和為 \(2n\),要讓 \(n\) 個字元相同至少連 \(n - 1\) 條邊,也就是奇數個數超過 \(2\) 時一定無解。
考慮如何構造,手玩應該會發現有一種左右橫跳的構造,對於單個迴文串,發現構造一個 \(x - 1/x + 1\) 的迴文串就能把這個迴文串串起來,\(+1/-1\) 可以用來拼接相鄰兩個迴文串,這樣能構造出 \(m = 2\) 的情況:
\(m > 2\) 可以考慮中間的串長度不變直接錯位,這在偶數的情況下能達到同樣的效果,但是奇數就不行了,所以直接把最多兩個奇數放到序列的兩端上。
E. BBQ Hard
去掉 \(i < j\) 的限制。
考慮格路計數,轉換成求每對 \((i, j)\),從 \((-a_i, -b_i)\) 到 \((a_j, b_j)\) 的方案數之和。
值域很小,\(O(V^2)\) 遞推就行了。
F. Wide Swap
顯然從值域入手好做,因為,交換操作變成相鄰的了。(即在逆排列 \(q\) 上考慮)
然後考慮相對順序 \(i < j\),如果 \(|q_i - q_j| < K\),那麼 \(q_i\) 一定在 \(q_j\) 前面,相當於建立了一個 DAG 的限制關係。
在 \(q\) 上怎麼貪呢,如果沒有限制,我們首先希望 \(q_i = 1\) 挪到越前面越好,然後是 \(q_i = 2\)。那在 DAG 上拓撲,用優先佇列維護就好了。
這個 DAG 只需要找到每個 \(q_i\) 最大的 \(j < i\) 滿足 \(|q_i - q_j| < K\) 且 \(q_j > q_i\) 就好了,因為 \(q_j < q_i\) 本身就會先決策,\(< j\) 的會和 \(j\) 串起來。
線段樹維護即可。