Codeforces Round 996 Div. 2

2025-01-12

A - Frogs

先に相手の隣に行ったほうが勝ちで、それは2人の差の偶奇を見ればよいです。

#include <bits/stdc++.h>
using namespace std;

void solve() {
    int n, a, b; cin >> n >> a >> b;
    if(abs(b-a)%2==0) cout << "YES\n";
    else cout << "NO\n";
}

int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    int t;
    cin >> t;
    while(t--)solve();
}

B - Crafting

素材が足りていないものが2つ以上あれば構成不可能です 。1つだけ足りていないものがある場合は、それ以外の素材の余剰のminが足りていない分を充足できるなら構成可能。全て足りているなら、自明に構成可能です。

#include <bits/stdc++.h>
using namespace std;

#define rep(i,n) for (ll i=0;i<n;++i)
const ll inf=1ll<<60;
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }

void solve() {
    int n; cin >> n;
    ll a[n], b[n];
    rep(i, n) cin >> a[i];
    rep(i, n) cin >> b[i];

    int cnt = 0;
    ll cmin = inf;
    ll sum = 0;
    rep(i, n) {
        if(a[i] < b[i]) {
            cnt += 1;
            sum += b[i] - a[i];
        } else {
            chmin(cmin, a[i] - b[i]);
        }
    }

    if (cnt == 0) {
        cout << "YES\n";
    } else if (cnt > 1) {
        cout << "NO\n";
    } else {
        if (sum <= cmin) {
            cout << "YES\n";
        } else {
            cout << "NO\n";
        }
    }
}

int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    int t;
    cin >> t;
    while(t--)solve();
}
これは適当な例を取って実験すればすぐに気付くと思います

C - The Trail

制約から考えると、どんな状況においてもなにか必ず構成可能な構成の仕方が一つ(以上)存在して、それを作る以外には考えられなさそうです。
手計算で試すと、全て0に合わせるパターンが入力例のテストケース1つ目と2つ目で構成可能そう なので実装をします。テストケースが合ったのでそのまま提出するとACが取れました。謎。

与えられた入力のrow, col毎の和を取ってそのmaxに合わせるとかも考えたがこれは合わなかった
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using vll=vector<ll>;
#define rep(i,n) for (ll i=0;i<n;++i)

void solve() {
    int n, m;
    string s;
    cin >> n >> m >> s;
    ll a[n][m];
    ll b[n][m];
    rep(i, n) rep(j, m) {
        cin >> a[i][j];
        b[i][j] = a[i][j];
    }

    vll row_sum(n, 0), col_sum(m, 0);

    rep(i, n) {
        rep(j, m) {
            row_sum[i] += a[i][j];
            col_sum[j] += a[i][j];
        }
    }

    int pi=0, pj=0;
    for (char c: s) {
        if (c == 'D') {
            b[pi][pj] = -row_sum[pi];
            row_sum[pi] += b[pi][pj];
            col_sum[pj] += b[pi][pj];
            pi += 1;
        } else {
            b[pi][pj] = -col_sum[pj];
            row_sum[pi] += b[pi][pj];
            col_sum[pj] += b[pi][pj];
            pj += 1;
        }
    }
    b[n-1][m-1] = -row_sum[n-1];
    assert(col_sum[m-1] + b[n-1][m-1] == 0);

    rep(i, n) rep(j, m) cout << b[i][j] << ((j+1 == m) ? '\n' : ' ');
}

int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    int t;
    cin >> t;
    while(t--)solve();
}