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\n"; continue; }
        if (k >= m) cout << "YES\n";
        else cout << "NO\n";
    }
    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 << '\n'; continue; }
        if (m) st.insert(k + *st.rbegin() + 1 >> 1);
        cout << st.size() << '\n';
    }
    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 << '\n';
    }
    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;
}
posted @ 2021-03-11 09:32  洛绫璃  阅读(160)  评论(0编辑  收藏  举报