Codeforces Round 906 (Div. 2) A~D题解

代码写的最丑陋的一集

A. Doremy’s Paint 3

由题可知在 b b b 中出现的数字只能有两个,且这两个数字的数量的差的绝对值不能大于 1 1 1

#include <bits/stdc++.h>

using namespace std;

#define int long long
#define pb push_back
#define endl '\n'
#define VI vector<int>
#define rep(i, j, k) for (int i = j; i <= k; ++i)
#define per(i, j, k) for (int i = j; i >= k; --i)
#define print(a) cout << a << endl;

const int inf = 0x3f3f3f3f;
const long long llinf = (long long)0x3f3f3f3f3f3f3f3f;
const long long MOD = (long long)1e9 + 7LL;
const size_t N = (size_t)1e6 + 5;

#define IO                       \
    ios::sync_with_stdio(false); \
    std::cin.tie(0);             \
    std::cout.tie(0)

#define debug(a) std::cerr << "\033[34m" << #a << ':' << a << "\033[0m" << endl

#define debugList(list)                        \
    std::cerr << "\033[34m" << #list << ": ["; \
    for (auto& e : list) {                     \
        std::cerr << e << ", ";                \
    }                                          \
    std::cerr << "\b\b]\033[0m" << endl

void solve(int cs) {
    int n;
    cin >> n;
    set<int> s;
    map<int, int> mp;
    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        s.insert(x);
        mp[x]++;
    }
    if (s.size() > 2) {
        cout << "NO\n";
        return;
    }
    else if (s.size() == 1) {
        cout << "YES\n";
        return;
    }
    else {  
        int cnt[2];
        int i = 0; 
        for (auto p : s) {
            cnt[i] = mp[p];
            i++;
        }
        if (abs(cnt[0] - cnt[1]) > 1) {
            cout << "NO\n";
            return;
        }
        else {
            cout << "YES\n";
            return;
        }
    }
}   

signed main() {
    IO;
    int T, TT = 1;
    T = 1; 
    cin >> T;
    while (T--) {
        solve(TT++);
    }
    return 0;
}

B. Qingshan Loves Strings

讨论题

想要构造出一个 good string要满足以下条件:

  • t t t 必须 01 01 01 交错且首位必须相同
  • s s s 中若出现 s i = s i + 1 s_i = s_{i+1} si=si+1 的情况, s i s_i si 必须和 t 0 t_0 t0 不同,且所有的 s i = s i + 1 s_i = s_{i+1} si=si+1 s i s_i si 必须全部相同
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define pb push_back
#define endl '\n'
#define VI vector<int>
#define rep(i, j, k) for (int i = j; i <= k; ++i)
#define per(i, j, k) for (int i = j; i >= k; --i)
#define print(a) cout << a << endl;

const int inf = 0x3f3f3f3f;
const long long llinf = (long long)0x3f3f3f3f3f3f3f3f;
const long long MOD = (long long)1e9 + 7LL;
const size_t N = (size_t)1e6 + 5;

#define IO                       \
    ios::sync_with_stdio(false); \
    std::cin.tie(0);             \
    std::cout.tie(0)

#define debug(a) std::cerr << "\033[34m" << #a << ':' << a << "\033[0m" << endl

#define debugList(list)                        \
    std::cerr << "\033[34m" << #list << ": ["; \
    for (auto& e : list) {                     \
        std::cerr << e << ", ";                \
    }                                          \
    std::cerr << "\b\b]\033[0m" << endl

void solve(int cs) {
    int n, m;
    cin >> n >> m;
    string s, t;
    cin >> s >> t;
    int f = 1;
    set<int> st;
    rep (i, 1, n - 1) {
        if (s[i] == s[i - 1]) {
            f = 0;
            st.insert(s[i - 1] - '0');
        }
    }
    if (f) {
        cout << "YES\n";
        return;
    }
    f = 0;
    rep (i, 1, m - 1) {
        if (t[i] == t[i - 1]) {
            f = 1;
        }
    }
    if (f || t[0] != t[m - 1] || st.size() > 1) {
        cout << "NO\n";
        return;
    }
    if (*st.rbegin() != (t[0] - '0')) {
        cout << "YES\n";
    }
    else {
        cout << "NO\n";
    }
}   

signed main() {
    IO;
    int T, TT = 1;
    T = 1; 
    cin >> T;
    while (T--) {
        solve(TT++);
    }
    return 0;
}

C. Qingshan Loves Strings 2

首先特判掉必不成立的情况:

  • n n n 为奇数
  • s s s 01 01 01 个数必须相同

然后双指针扫描 s s s

  • 当 $s[l] == s[r] $ 且 s [ l ] = ′ 0 ′ s[l] = '0' s[l]=0 时,在 r + 1 r + 1 r+1 处插入 “ 01 01 01” ,记录答案,更新 r r r
  • 当 $s[l] == s[r] $ 且 s [ l ] = ′ 1 ′ s[l] = '1' s[l]=1 时,在 l l l 处插入 “ 01 01 01” ,记录答案,更新 r r r
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define pb push_back
#define endl '\n'
#define VI vector<int>
#define rep(i, j, k) for (int i = j; i <= k; ++i)
#define per(i, j, k) for (int i = j; i >= k; --i)
#define print(a) cout << a << endl;

const int inf = 0x3f3f3f3f;
const long long llinf = (long long)0x3f3f3f3f3f3f3f3f;
const long long MOD = (long long)1e9 + 7LL;
const size_t N = (size_t)1e6 + 5;

#define IO                       \
    ios::sync_with_stdio(false); \
    std::cin.tie(0);             \
    std::cout.tie(0)

#define debug(a) std::cerr << "\033[34m" << #a << ':' << a << "\033[0m" << endl

#define debugList(list)                        \
    std::cerr << "\033[34m" << #list << ": ["; \
    for (auto& e : list) {                     \
        std::cerr << e << ", ";                \
    }                                          \
    std::cerr << "\b\b]\033[0m" << endl

void solve(int cs) {
    int n;
    cin >> n;
    string s;
    cin >> s;

    if (n & 1) {cout << "-1\n"; return;} int c1 = count(s.begin(), s.end(), '1'); int c2 = n - c1; if (c1 != c2) {cout << "-1\n"; return;}

    VI ans;
    string t = "01";
    int l = 0, r = n - 1;
    while (l <= r) {
        if (s[l] != s[r]) {l++; r--; continue;}
        else {
            if (s[l] == '0') {
                s.insert(r + 1, t);
                ans.pb(r + 1);
                r += 2;
            }
            else {
                s.insert(l, t);
                ans.pb(l);
                r += 2;
            }
            l++; r--;
        }
    }
    print(ans.size());
    for (auto p : ans) {
        cout << p << " ";
    }
    cout << endl;
}   

signed main() {
    IO;
    int T, TT = 1;
    T = 1; 
    cin >> T;
    while (T--) {
        solve(TT++);
    }
    return 0;
}                

D. Doremy’s Connecting Plan

贪心

本题必用1号点去连所有的点,令 s u m sum sum 表示 ∑ k ∈ S a k \sum\limits_{k \in S} a_k kSak ,当 s u m + ( a i − i ∗ c ) ≥ 0 sum + (a_i-i*c) \ge 0 sum+(aiic)0 时即可连点

故我们将除 a 1 a_1 a1 以外的 a i − i ∗ c a_i-i*c aiic 加入到大根堆中,每次连堆顶的点即可

#include <bits/stdc++.h>

using namespace std;

#define int long long
#define pb push_back
#define endl '\n'
#define VI vector<int>
#define pii pair<int, int>
#define rep(i, j, k) for (int i = j; i <= k; ++i)
#define per(i, j, k) for (int i = j; i >= k; --i)
#define print(a) cout << a << endl;

const int inf = 0x3f3f3f3f;
const long long llinf = (long long)0x3f3f3f3f3f3f3f3f;
const long long MOD = (long long)1e9 + 7LL;
const size_t N = (size_t)1e6 + 5;

#define IO                       \
    ios::sync_with_stdio(false); \
    std::cin.tie(0);             \
    std::cout.tie(0)

#define debug(a) std::cerr << "\033[34m" << #a << ':' << a << "\033[0m" << endl

#define debugList(list)                        \
    std::cerr << "\033[34m" << #list << ": ["; \
    for (auto& e : list) {                     \
        std::cerr << e << ", ";                \
    }                                          \
    std::cerr << "\b\b]\033[0m" << endl

struct cmp {
    bool operator()(pii x, pii y) {
        return x.first < y.first;
    }
};

void solve(int cs) {
    int n, c;
    cin >> n >> c;
    priority_queue<pii, vector<pii>, cmp> q;
    int sum;
    cin >> sum;
    rep (i, 2, n) {
        int x;
        cin >> x;
        q.push(make_pair(x - i * c, x));
    }
    while (!q.empty()) {
        auto x = q.top();
        if (x.first + sum >= 0) {
            sum += x.second;
            q.pop();
        }
        else {
            cout << "NO\n";
            return;
        }
    }
    cout << "YES\n";
}   

signed main() {
    IO;
    int T, TT = 1;
    T = 1; 
    cin >> T;
    while (T--) {
        solve(TT++);
    }
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值