A. Triple Four

模拟

代码实现
n = int(input())
a = list(map(int, input().split()))
ans = any(a[i] == a[i+1] == a[i+2] for i in range(n-2))
print('Yes' if ans else 'No')

B. Card Pile

模拟

代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)

using namespace std;

int main() {
    int q;
    cin >> q;
    
    vector<int> st(100, 0);
    rep(qi, q) {
        int type;
        cin >> type;
        if (type == 1) {
            int x;
            cin >> x;
            st.push_back(x);
        }
        else {
            int ans = st.back();
            st.pop_back();
            cout << ans << '\n';
        }
    }
    
    return 0;
}

C. Buy Balls

先对 \(B\)\(W\) 做降序排序
答案就是 \(B\) 的当前前缀和 + \(W\) 的当前最大前缀和取最大值即可

代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)

using namespace std;
using ll = long long;

int main() {
    int n, m;
    cin >> n >> m;
    
    vector<int> b(n), w(m);
    rep(i, n) cin >> b[i];
    rep(i, m) cin >> w[i];
    
    ranges::sort(b, greater<>());
    ranges::sort(w, greater<>());
    
    ll ans = 0;
    ll sumb = 0;
    ll maxw = 0, sumw = 0;
    rep(i, n) {
        sumb += b[i];
        if (i < m) sumw += w[i];
        maxw = max(maxw, sumw);
        ans = max(ans, sumb+maxw);
    }
    
    cout << ans << '\n';
    
    return 0;
}

D. Minimum XOR Path

爆搜

代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)

using namespace std;
using ll = long long;

int main() {
    int n, m;
    cin >> n >> m;
    
    vector<vector<pair<int, ll>>> g(n);
    rep(i, m) {
        int a, b; ll w;
        cin >> a >> b >> w;
        --a; --b;
        g[a].emplace_back(b, w);
        g[b].emplace_back(a, w);
    }
    
    ll ans = 1ll<<60;
    auto dfs = [&](auto& f, int v, int used=0, ll x=0) -> void {
        used |= 1<<v;
        if (v == n-1) {
            ans = min(ans, x);
            return;
        }
        for (auto [u, w] : g[v]) {
            if (used>>u&1) continue;
            f(f, u, used, x^w);
        }
    };
    dfs(dfs, 0);
    
    cout << ans << '\n';
    
    return 0;
}

E. Min of Restricted Sum

按位处理
对每个连通分量也是单独处理
对于每个连通分量而言,有两种对称的填数方案,当然也可能这两种填数方案存在矛盾。
对于两种填数方案,显然取填 \(1\) 的个数少的那种方案更优

代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)

using namespace std;
using P = pair<int, int>;

int main() {
    int n, m;
    cin >> n >> m;
    
    vector<vector<P>> g(n);
    rep(i, m) {
        int a, b, c;
        cin >> a >> b >> c;
        --a; --b;
        g[a].emplace_back(b, c);
        g[b].emplace_back(a, c);
    }
    
    bool ok = true;
    vector<int> ans(n);
    rep(k, 30) {
        vector<int> col(n, -1);
        rep(sv, n) if (col[sv] == -1) {
            vector<vector<int>> vs(2);
            auto dfs = [&](auto& f, int v, int c=0) -> void {
                if (col[v] != -1) {
                    if (col[v] != c) ok = false;
                    return;
                }
                col[v] = c;
                vs[c].push_back(v);
                for (auto [u, z] : g[v]) {
                    f(f, u, c^(z>>k&1));
                }
            };
            dfs(dfs, sv);
            if (vs[0].size() < vs[1].size()) swap(vs[0], vs[1]);
            for (int v : vs[1]) ans[v] |= 1<<k;
        }
    }
    if (!ok) {
        puts("-1");
        return 0;
    }
    
    rep(i, n) cout << ans[i] << " \n"[i == n-1];
    
    return 0;
}

F. Rotated Inversions

考虑二元组 \((i, j)\) 的逆序对的贡献
\(i\) 个数从 \(M-1\) 变成 \(0\) 时,左侧会增加 \(i-1\) 个逆序对,右侧则会减少 \(n-i\) 个逆序对,每次只更新当前会发生变化的部分的贡献即可

代码实现
#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;
using P = pair<int, int>;

int main() {
    int n, m;
    cin >> n >> m;
    
    vector<P> p;
    rep(i, n) {
        int a;
        cin >> a;
        p.emplace_back(a, i);
    }
    
    ranges::sort(p);
    
    ll now = 0;
    fenwick_tree<int> t(n);
    rep(i, n) {
        int j = p[i].second;
        now += t.sum(j, n);
        t.add(j, 1);
    }
    
    for (int x = m-1; x >= 0; --x) {
        cout << now << '\n';
        while (p.size() and p.back().first == x) {
            int j = p.back().second;
            p.pop_back();
            now += j; now -= n-1-j;
        }
    }
    
    return 0;
}

G. Flip Row or Col

原题:CF662C

不知道为啥官解做法不是异或卷积