• Codeforces Round #706 (Div. 2)


    Codeforces Round #706 (Div. 2)

    A - Split it!

    有点像回文

    int main() {
        IOS;
        for (cin >> _; _; --_) {
            cin >> n >> m >> s + 1; k = 0;
            rep (i, 1, n >> 1) if (s[i] == s[n + 1 - i]) ++k; else break;
            if (m * 2 == n) { cout << "NO
    "; continue; }
            if (k >= m) cout << "YES
    ";
            else cout << "NO
    ";
        }
        return 0;
    }
    

    B - Max and Mex

    如果 Mex > n - 1, 每次都会插入新值, 否则只能插入一次

    int main() {
        IOS;
        for (cin >> _; _; --_) {
            cin >> n >> m; set<int> st; int k = 0;
            rep (i, 1, n) cin >> cas, st.insert(cas);
            for (auto &i : st) {
                if (i == k) ++k;
                else break;
            }
            if (k == n) { cout << n + m << '
    '; continue; }
            if (m) st.insert(k + *st.rbegin() + 1 >> 1);
            cout << st.size() << '
    ';
        }
        return 0;
    }
    

    C - Diamond Miner

    贪心, 大的和大的在一起开根号 损失的更多

    int main() {
        IOS;
        for (cin >> _; _; --_) {
            cin >> n; int x = 0, y = 0;
            rep (i, 1, n << 1) {
                cin >> a[0].fi >> a[0].se;
                if (a[0].se) a[++x].se = abs(a[0].se);
                else b[++y].fi = abs(a[0].fi);
            }
            sort(a + 1, a + 1 + n); sort(b + 1, b + 1 + n);
            double ans = 0;
            rep (i, 1, n) ans += sqrt(sqr(a[i].se) + sqr(b[i].fi));
            cout << precision(15) << ans << '
    ';
        }
        return 0;
    }
    

    D - Let's Go Hiking

    注意到 只能有一条最长链, 否则先手站一条, 后手站一条, 先手必输

    其次, 只有一条最长链, 先手和后手都会选在最长链上, 否则谁不在, 另一方直接获胜

    在其 先手会在山峰, 否则后手直接卡死

    故先手会选择在 最长链的最高端, 后手会选择最长链最远的地方, 保证和先手相隔 偶数个位置(保证两者都走最长链, 后手胜)

    后手保证了先手最长链一定会输, 只能走最长链的反方向, 比较先手和后手能走的长度, 判断是否能先手赢

    void work(int x, int y) {
        int c = (x - 1) & 1 ? x - 2 : x - 1;
        if (1 + c >= y) cout << 0;
        else cout << 1;
    }
     
    int main() {
        IOS; cin >> n; a[0] = a[n + 1] = N;
        rep (i, 1, n) {
            cin >> a[i], b[i] = a[i] > a[i - 1] ? b[i - 1] + 1 : 0;
            if (umax(m, b[i])) cnt = 1, w = i;
            else if (m == b[i]) ++cnt;
        }
        per (i, n, 1) {
            c[i] = a[i] > a[i + 1] ? c[i + 1] + 1 : 0;
            if (umax(m, c[i])) cnt = 1, w = i;
            else if (m == c[i] && w != i) ++cnt;
        }
        if (cnt > 1) return cout << 0, 0;
        if (b[w] == m) work(b[w], c[w]);
        else work(c[w], b[w]);
        return 0;
    }
    
  • 相关阅读:
    4.2 省选模拟赛 流浪者 容斥dp
    4.2 省选模拟赛 旅行路线 广义SAM
    4.2 省选模拟赛 摆棋子 网络流 最大流/上下界最小流
    bzoj 4316 小C的独立集
    CF R630 div2 1332 E Height All the Same
    C++多线程の条件变量
    c++多线程のunique和lazy initation
    c++多线程の死锁与防止死锁
    c++多线程の数据竞争和互斥对象
    c++的多线程和多进程
  • 原文地址:https://www.cnblogs.com/2aptx4869/p/14515842.html
Copyright © 2020-2023  润新知