Codeforces Round 920(div3)A - G except E

A - Square

  • 思维
  • 按行或列排序
signed main() {
 
    int T = 1;
    T = read();
    while (T--) {
        vector<pii> vec;
        for (int i = 1; i <= 4; ++i) {
            int u = read(), v = read();
            vec.push_back({u, v});
        }
        sort(vec.begin(), vec.end());
        int a = abs(vec[0].second - vec[1].second);
        int b = abs(vec[0].first - vec[2].first);
        writeln(a * b);
    }
    return 0;
}

B - Arranging Cats

  • 思维
  • 记录两个的 1 1 1 的数量。
  • 相同位置同为 1 1 1 则不用操作。
  • 谁大则答案加上减去相同位置同为 1 1 1 的数量(要么补,移,删)
signed main() {
 
    int T = 1;
    T = read();
    while (T--) {
        int n = read();
        string s1, s2; cin >> s1 >> s2;
        int cnt1 = count(s1.begin(), s1.end(), '1'), cnt2 = count(s2.begin(), s2.end(), '1');
        int ans = 0;
        int cnt = 0;
//        tf(cnt1),tf(cnt2);
        for (int i = 0; i < n; ++i) {
            if (s1[i] == s2[i] && s1[i] == '1') ++cnt;
        }
        if (cnt1 >= cnt2) ans += cnt1 - cnt;
        else ans += cnt2 - cnt;
        writeln(ans);
    }
    return 0;
}

C - Sending Messages

  • 模拟
  • 两种方事选择消耗小的一种
signed main() {
 
    int T = 1;
    T = read();
    while (T--) {
        int n = read(), f = read(), a = read(), b = read();
        vector<int> e(n + 1);
        bool ff = 1;
        int pre = 0;
        for (int i = 1; i <= n; ++i) e[i] = read();
        for (int i = 1; i <= n; ++i) {
            if ((e[i] - pre) * a <= b) f -= (e[i] - pre) * a;
            else f -= b;
            if (f <= 0) {
                ff = 0;
                break;
            }
            pre = e[i];
        }
        ff? puts("yes"): puts("no");
    }
    return 0;
}

D - Very Different Array

  • 贪心
  • a a a 最小的与 b b b 最大的匹配, a a a 最大的与 b b b 最小的匹配。
signed main() {
 
    int T = 1;
    T = read();
    while (T--) {
        int n = read(), m = read();
        deque<int> a, b;
        for (int i = 1; i <= n; ++i) {
            int u = read();
            a.push_back(u);
        }
        for (int i = 1; i <= m; ++i) {
            int u = read();
            b.push_back(u);
        }
        sort(a.begin(), a.end());
        sort(b.begin(), b.end(), greater<int>());
        int ans = 0;
        for (int i = 0; i < n; ++i) {
            int t1 = abs(a.front() - b.front()), t2 = abs(a.back() - b.back());
            if (t1 > t2) {
                ans += t1;
                a.pop_front(), b.pop_front();
            }
            else {
                ans += t2;
                a.pop_back(), b.pop_back();
            }
        }
        writeln(ans);
    }
    return 0;
}

E - Eat the Chip 待补

F - Sum of progression

  • 根号分治
  • 预处理 d ≤ n d\leq \sqrt{n} dn ,暴力 d > s q r t    O ( n ⋅ n ) d>sqrt{}\;O(n\cdot \sqrt{n}) d>sqrtO(nn )
vector<vector<int>> pref(N + 322, vector<int>(323)), sum(N + 322, vector<int>(323));
signed main() {
 
    int T = 1;
    T = read();
    while (T--) {
        int n = read(), q = read();
        int D = sqrt(n);
//        while (D * D < n) ++D;
        vector<int> a(n + 1);
        for (int i = 1; i <= n; ++i) a[i] = read();
        for (int i = 1; i <= D; ++i) pref[1][i] = sum[1][i] = 0;
        for (int d = 1; d <= D; ++d) {
            for (int i = 1; i <= n; ++i) {
                pref[i + d][d] = pref[i][d] + a[i];
                sum[i + d][d] = sum[i][d] + a[i] * (i / d + 1);
            }
        }
        while (q--) {
            int s = read(), d = read(), k = read();
            if (d <= D) {
                int r = s + d * k;
                writesp(sum[r][d] - sum[s][d] - (pref[r][d] - pref[s][d]) * (s / d));
            }
            else {
                int ans = 0;
                for (int i = 0; i < k; ++i) ans += a[s + d * i] * (i + 1);
                writesp(ans);
            }
        }
        puts("");
    }
    return 0;
}

G - Mischievous Shooter

  • 枚举 + 模拟
  • 枚举每一个点即可,只考虑图里第一个的情况,其余三个可以翻转矩形。

c o d e    l e a r n    f r o m    j i a n g l y code \;learn\;from\;jiangly codelearnfromjiangly 简洁多了

signed main() {
    int T = 1;
    T = read();
    while (T--) {
        int n = read(), m = read(), k = read();
        vector<string> s(n);
        for (int i = 0; i < n; ++i) cin >> s[i];
        int ans = 0;
        auto solve = [&] () {
            vector<vector<int>> pref1(n, vector<int>(m)), pref2(n, vector<int>(m));
            for (int i = 0; i < n; ++i) {
                for (int j = 0; j < m; ++j) {
                    if (i) pref1[i][j] = pref1[i - 1][j];
                    if (i && j < m - 1) pref2[i][j] = pref2[i - 1][j + 1];
                    pref1[i][j] += (s[i][j] == '#');
                    pref2[i][j] += (s[i][j] == '#');
                }
            }
            vector<vector<int>> dp(n, vector<int>(m));
            for (int i = 0; i < n; ++i) {
                for (int j = 0; j < m; ++j) {
                    if (j) {
                        dp[i][j] = dp[i][j - 1];
                        if (i + j > k) {
                            int x = i, y = j - (k + 1);
                            if (y < 0) x += y, y = 0;
                            dp[i][j] -= pref2[x][y];
                        }
                        if (i >= k + 1) dp[i][j] += pref2[i - (k + 1)][j];
                    }
                    dp[i][j] += pref1[i][j];
                    if (i >= k + 1) dp[i][j] -= pref1[i - (k + 1)][j];
                    ans = max(ans, dp[i][j]);
                }
            }
        };
        solve();
        reverse(s.begin(), s.end());
        solve();
        for (auto &it: s) reverse(it.begin(), it.end());
        solve();
        reverse(s.begin(), s.end());
        solve();
        writeln(ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Heredy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值