Submission #1209099

#TimeUsernameProblemLanguageResultExecution timeMemory
1209099BoomydayRemittance (JOI19_remittance)C++17
55 / 100
1092 ms12104 KiB
#include <bits/stdc++.h>
using namespace std;

// Binary exponentiation (long double version)
long double bexp(long double a, int k) {
    if (k == 0) return 1.0L;
    long double half = bexp(a, k / 2);
    long double res = half * half;
    if (k % 2 == 1) res *= a;
    return res;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;

    vector<int> X(n);
    long long sa = 0, sb = 0;

    for (int i = 0; i < n; ++i) {
        int a, b;
        cin >> a >> b;
        sa += a;
        sb += b;
        X[i] = a - b;
    }

    if (sb == 0) {
        if (sa == 0) {
            cout << "Yes\n";
        } else {
            cout << "No\n";
        }
        return 0;
    }

    vector<long long> ans(n);
    long double val = 0;

    for (int i = 1; i < n; ++i) {
        val += X[i] * bexp(2.0L, i - 1);
    }
    val += X[0] * bexp(2.0L, n - 1);

    long double denom = bexp(2.0L, n) - 1;
    long double raw_ans0 = val / denom;

    // Use tighter epsilon for integer check
    constexpr long double EPS = 1e-12L;

    if (fabsl(raw_ans0 - roundl(raw_ans0)) > EPS) {
        cout << "No\n";
        return 0;
    }

    ans[0] = (long long)roundl(raw_ans0);

    if (ans[0] < 0) {
        cout << "No\n";
        return 0;
    }

    for (int i = 1; i < n; ++i) {
        long long sum = ans[i - 1] + X[i];
        if (sum % 2 != 0) {
            cout << "No\n";
            return 0;
        }
        ans[i] = sum / 2;
        if (ans[i] < 0) {
            cout << "No\n";
            return 0;
        }
    }

    cout << "Yes\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...