zoukankan      html  css  js  c++  java
  • Codeforces Round #712 (Div. 2)

    Codeforces Round #712 (Div. 2)

    A - Déjà Vu

    找到个位置对称位置 != 'a' 即可, 找不到且全串不为 'a', 直接放最后

    int n, m, _, k, cas;
    char s[N];
     
    int main() {
        IOS;
        for (cin >> _; _; --_) {
            cin >> s + 1; n = strlen(s + 1);
            bool f = 1; m = n;
            rep (i, 1, n) if (s[i] ^ 'a') f = 0;
            if (f) { cout << "NO
    "; continue; }
            cout << "YES
    ";
            rep (i, 1, n >> 1) if (s[n + 1 - i] ^ 'a') m = i;
            rep (i, 1, n) {
                if (m == i) cout << 'a';
                cout << s[i];
            } 
            cout << '
    ';
        }
        return 0;
    }
    

    B - Flip the Bits

    倒序修改每个位置, 则要保证每个位置的前缀 0, 1 为偶数即可

    int c[N];
    char a[N], b[N];
     
    int main() {
        IOS;
        for (cin >> _; _; --_) {
            cin >> n >> a + 1 >> b + 1;
            rep (i, 1, n) c[i] = 0; bool f = 1, g = 1;
            rep (i, 1, n) c[i] += c[i - 1] + (a[i] ^ '1');
            per (i, n, 1) if (g ^ (a[i] == b[i])) {
                if ((i & 1) || c[i] != i >> 1) f = 0;
                g ^= 1; 
            }
            cout << (f ? "YES
    " : "NO
    ");
        }
        return 0;
    }
    

    C - Balance the Bits

    因为1相同, 0不相同, 故 0, 1数都为偶数, 且都是对于a来说, 一般是'('

    故模拟即可, 当不合法时, 直接break

    char s[N], a[N], b[N];
     
    int main() {
        IOS;
        for (cin >> _; _; --_) {
            cin >> n >> s + 1; bool f = 1; int x = 0, y = 0, c = 0;
            rep (i, 1, n) if (s[i] == '1') ++c;
            if (c & 1) { cout << "NO
    "; continue; }
            rep (i, 1, n) {
                if (s[i] == '1') {
                    if (c) a[i] = b[i] = '(', c -= 2, ++x, ++y;
                    else a[i] = b[i] = ')', --x, --y;
                } else {
                    if (x >= y) a[i] = ')', b[i] = '(', --x, ++y;
                    else a[i] = '(', b[i] = ')', ++x, --y;
                }
                if (x < 0 || y < 0) { f = 0; break; }
            }
            if (!f) { cout << "NO
    "; continue; }
            a[n + 1] = b[n + 1] = '';
            cout << "YES
    " << a + 1 << '
    ' << b + 1 << '
    ';
        }
        return 0;
    }
    

    D - 3-Coloring

    先想没有禁手, 那毫无疑问用两种数即可, 分奇偶填不就完了?

    有了禁手, 多了个颜色3, 那就再把所有 奇数/偶数 格子填完之后, 要么填 2/1 , 要么填 3 即可

    vector<PII> a[2];
     
    int main() {
        IOS; cin >> n;
        rep (i, 1, n) rep (j, 1, n) a[i + j & 1].pb(i, j);
        rep(_, 1, n * n) {
            cin >> k;
            if (k != 2 && !a[1].empty()) cout << 2 << ' ' << a[1].back().fi << ' ' << a[1].back().se << endl, a[1].pop_back();
            else if (k != 1 && !a[0].empty()) cout << 1 << ' ' << a[0].back().fi << ' ' << a[0].back().se << endl, a[0].pop_back();
            else if (!a[1].empty()) cout << 3 << ' ' << a[1].back().fi << ' ' << a[1].back().se << endl, a[1].pop_back();
            else cout << 3 << ' ' << a[0].back().fi << ' ' << a[0].back().se << endl, a[0].pop_back();
        }
        return 0;
    }
    

    E - Travelling Salesman Problem

    注意到是欧拉回路, 那么必然最小路费是 (sum c_i)

    那我们的目标就是去使得 (max(c_i, a_{nxt} - a_i) == c_i) 了 即 (a_{nxt} = a_i + c_i)

    那就处理呗, 先按 ({a_i, c_i}) 排序

    再从小到大, 二分查找最大范围的可匹配点集, 即 ([i, r_i])

    (r_i = upper\_bound(p + 1, p + 1 + n, {a_i + c_i, INF}) - 1)

    则我们目标是求一个区间 [L, R] 使得 [L, R] 区间内除了点(R) 其他点可以形成一条链路, 权值全是 (c_i)

    也就是循环去求最(r_i) 直到 (r_i == i) 我们就得到了一个这样的区间[L, R],

    区间内除了(R)其他点都可以向([i, r_i])这些点连边, 同时也可以向([L, i - 1]) 连边

    这个区间的点总能最大匹配(二分图, 这里就不证了), 所以当前区间维护了 [L, R] 的贡献为区间 (sum c_i)

    然后就是这段 ([L_i, R_i]) 去和下一段 ([R_i + 1, R_{i + 1}]) 连边的问题

    肯定是连向 (R_i+1) 毕竟是下一段中(a_i) 最小的, 假设选择 ([L_i, R_i]) 中的点 j, 那么原贡献就要减去 (c_i)

    毕竟 (a_{R_i+1} - a_j > c_j) 否则 ([L_i, R_i]) 必定可以加入点(R_i+1)

    也就是原贡献 加上 (a_{R_i+1} - a_j - c_j) 所以我们在便利的时候在维护一个区间最大 (a_j + c_j) 即可

    PII a[N];
    
    int main() {
        IOS; cin >> n; ll ans = 0;
        rep (i, 1, n) cin >> a[i].fi >> a[i].se, ans += a[i].se; sort(a + 1, a + 1 + n);
        for (int i = 1, j = 0, mx = 0; i < n; ++i) {
            umax(j, upper_bound(a + 1, a + 1 + n, PII{ a[i].fi + a[i].se, 2e9 }) - a - 1);
            umax(mx, a[i].fi + a[i].se);
            if (j == i) ans += a[i + 1].fi - mx, mx = j = 0;
        }
        cout << ans;
        return 0;
    }
    

    F - Flip the Cards

  • 相关阅读:
    arthas命令ognl视频演示
    arthas命令sc和sm视频演示
    混合Java函数和Groovy闭包
    Mock System.in和检查System.out
    arthas命令logger动态修改日志级别--视频演示
    删除List中null的N种方法--最后放大招
    ovs安装教程
    win10中安装与配置maven
    win10系统中按顺序安装jdk、tomcat
    win10系统中按顺序安装jdk、tomcat
  • 原文地址:https://www.cnblogs.com/2aptx4869/p/14615677.html
Copyright © 2011-2022 走看看