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;
}