Submission #1364116

#TimeUsernameProblemLanguageResultExecution timeMemory
1364116digitaldreamerStranded Far From Home (BOI22_island)C++20
15 / 100
39 ms22360 KiB
#include <bits/stdc++.h>

using namespace std;

#define pb push_back

int64_t n, m;
vector<int64_t> a(200005), pr(200005, 0);
int sp[20][200005];
int lg[200005];
bool an[200005];

int query(int l, int r) {
    int k = lg[r - l + 1];
    int x = sp[k][l];
    int y = sp[k][r - (1 << k) + 1];
    return (a[x] >= a[y] ? x : y);
}

void rec(int l, int r, int par_idx) {
    if (l > r) return;

    int p = query(l, r);
    
    if (par_idx == -1) {
        an[p] = true;
    } else {
        int64_t current_sum = pr[r] - pr[l - 1];
        if (an[par_idx] && current_sum >= a[par_idx]) {
            an[p] = true;
        } else {
            an[p] = false;
        }
    }

    rec(l, p - 1, p);
    rec(p + 1, r, p);
}

void solve() {
    if (!(cin >> n >> m)) return;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        pr[i] = pr[i - 1] + a[i];
        sp[0][i] = i;
    }

    for (int i = 1; i <= m; i++) {
        int u, v;
        cin >> u >> v;
    }

    lg[1] = 0;
    for (int i = 2; i <= n; i++) lg[i] = lg[i / 2] + 1;

    for (int i = 1; i < 20; i++) {
        for (int j = 1; j + (1 << i) - 1 <= n; j++) {
            int x = sp[i - 1][j];
            int y = sp[i - 1][j + (1 << (i - 1))];
            sp[i][j] = (a[x] >= a[y] ? x : y);
        }
    }

    rec(1, n, -1);

    for (int i = 1; i <= n; i++) {
        cout << (an[i] ? '1' : '0');
    }
    cout << endl;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...