제출 #489747

#제출 시각아이디문제언어결과실행 시간메모리
489747AA_Surely송금 (JOI19_remittance)C++14
100 / 100
203 ms26244 KiB
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

#include <bits/stdc++.h>

#define FOR(i,x,n) 	for(int i=x; i<n; i++)
#define F0R(i,n) 	FOR(i,0,n)
#define ROF(i,x,n) 	for(int i=n-1; i>=x; i--)
#define R0F(i,n) 	ROF(i,0,n)

#define WTF 		cout << "WTF" << endl

#define IOS 		ios::sync_with_stdio(false); cin.tie(0); 

using namespace std;
typedef long long 		LL;

const int MAXN = 1e6 + 1;

int n;
LL as[MAXN], bs[MAXN];

int main() {
    IOS;
    cin >> n;
    F0R(i, n) cin >> as[i] >> bs[i];
    
    bool changed = 1;
    while (changed) {
        changed = 0;
        /*
        cout << "NOW: ";
        F0R(i, n) cout << as[i] << ' ';
        cout << endl;
        */

        F0R(i, n - 1) {
            if (as[i] > bs[i]) {
                if ((as[i] & 1) == (bs[i] & 1)) {
                    as[i + 1] += (as[i] - bs[i]) >> 1;
                    as[i] = bs[i];
                    changed = 1;
                }

                else if (bs[i]) {
                    as[i + 1] += ((as[i] - bs[i]) >> 1) + 1;
                    as[i] = bs[i] - 1;
                    changed = 1;
                }

                else {
                    if (as[i] > 1) changed = 1;
                    as[i + 1] += ((as[i] - bs[i]) >> 1);
                    as[i] = bs[i] + 1;
                }
            }
        }

        if (as[n - 1] > bs[n - 1]) {
            if ((as[n - 1] & 1) == (bs[n - 1] & 1)) {
                as[0] += (as[n - 1] - bs[n - 1]) >> 1;
                as[n - 1] = bs[n - 1];
                changed = 1;
            }

            else if (bs[n - 1]) {
                as[0] += ((as[n - 1] - bs[n - 1]) >> 1) + 1;
                as[n - 1] = bs[n - 1] - 1;
                changed = 1;
            }

            else {
                if (as[n - 1] > 1) changed = 1;
                as[0] += ((as[n - 1] - bs[n - 1]) >> 1);
                as[n - 1] = bs[n - 1] + 1;
            }
        }

        if (!changed) break;
    }

    F0R(i, n) if (as[i] != bs[i]) {
        cout << "No";
        return 0;
    }

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