A. Four Coloring
\(1 \to 2, 2 \to 4, 3 \to 1, 4 \to 3\)
B. Independent Nim
是否存在长度不是 \(2\) 的块
C. K Spanning Tree
先添加边权为 \(0\) 的边,之后尽可能多地添加边权为 \(1\) 的边。如果此时(边权为 \(1\) 的边)数量超过 \(K\) 个,则说明无解。重置图的状态,先加入刚才添加的那些边权为 \(1\) 的边,接着继续添加边权为 \(1\) 的边直至达到 \(K\) 个,最后再添加边权为 \(0\) 的边。
D. Gap Swap (easy)
\(\sum \max(p_i-i, 0)\)
E. Gap Swap (hard)
先把 \(P_i\) 减 \(1\) 变成 \((0, 1, \cdots, N-1)\) 的排列
令 \(\text{lm}\) 表示在 \(P_i\) 的左边,有多少个元素的值大于 \(P_i\),\(\text{rm}\) 表示在 \(P_i\) 的右边,有多少个元素的值小于 \(P_i\) 。
容易发现 \(\text{rm} = P_i - (i-\text{lm})\)
对于每个元素,它对答案的贡献可以被完美地证明为:
\[\Delta = \text{lm} - 2 \times \min(\text{lm}, \text{rm})
\]
代码实现
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace atcoder;
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
using ll = long long;
int main() {
int n;
cin >> n;
fenwick_tree<int> t(n);
ll ans = 0;
rep(i, n) {
int p;
cin >> p;
--p;
int lm = t.sum(p, n);
t.add(p, 1);
int rm = p - (i-lm);
ans += lm - 2*min(lm, rm);
}
cout << ans << '\n';
return 0;
}
浙公网安备 33010602011771号