Codeforces Round #722 (Div. 2)

Codeforces Round #722 (Div. 2)

A - Eshag Loves Big Arrays

int main() {
    IOS;
    for (cin >> _; _; --_) {
        cin >> n; map<int, int> st;
        rep (i, 1, n) cin >> m, ++st[m];
        cout << n - st.begin()->second << '\n';
    }
    return 0;
}

B - Sifid and Strange Subsequences

int main() {
    IOS;
    for (cin >> _; _; --_) {
        cin >> n;
        rep (i, 1, n) cin >> a[i];
        sort(a + 1, a + 1 + n);
        int cnt = upper_bound(a + 1, a + 1 + n, 0) - a - 1;
        int cnt0 = cnt - (upper_bound(a + 1, a + 1 + n, -1) - a - 1);
        m = 2e9;
        rep (i, 1, cnt - cnt0) umin(m, a[i + 1] - a[i]);
        k = a[upper_bound(a + 1, a + 1 + n, m) - a - 1];
        cout << max(cnt, cnt - cnt0 + (cnt0 != 0) + (k > 0 && k <= m)) << '\n';
    }
    return 0;
}

C - Parsa's Humongous Tree

取中间是使得绝对值差最小, 显然取两端使得绝对值差最大

每个点要么选\(l\), 要么选\(r\), 典型的树形dp

int l[N], r[N];
ll f[N][2]; 
VI h[N];

void dfs(int x, int fa) {
    for (auto &y : h[x]) if (y ^ fa) {
        dfs(y, x);
        f[x][0] += max(f[y][0] + abs(l[x] - l[y]), f[y][1] + abs(l[x] - r[y]));
        f[x][1] += max(f[y][0] + abs(r[x] - l[y]), f[y][1] + abs(r[x] - r[y]));
    }
}

int main() {
    IOS;
    for (cin >> _; _; --_) {
        cin >> n;
        rep (i, 1, n) cin >> l[i] >> r[i], clear(h[i]), f[i][0] = f[i][1] = 0;
        rep (i, 2, n) {
            int u, v; cin >> u >> v;
            h[u].pb(v); h[v].pb(u);
        }
        dfs(1, 0);
        cout << max(f[1][0], f[1][1]) << '\n';
    }
    return 0;
}

D - Kavi on Pairing Duty

对于不交叉, 也不包含的, 就是找\(n\)的因子个数即可,

否则链接\(1, n\), 相当于少了\(2\)个点, 也就变成了\(n - 1\)

dp完事

ll f[N], s;

int main() {
    IOS; cin >> n;
    rep (i, 1, n) for (int j = i; j <= n; j += i) ++f[j];
    rep (i, 1, n) {
        f[i] = (f[i] + s) % mod;
        s = (s + f[i]) % mod;
    }
    cout << f[n];
    return 0;
}
posted @ 2021-05-25 21:39  洛绫璃  阅读(63)  评论(0编辑  收藏  举报