Submission #1369255

#TimeUsernameProblemLanguageResultExecution timeMemory
1369255piolkStranded Far From Home (BOI22_island)C++20
100 / 100
85 ms17092 KiB
#include <bits/stdc++.h>
using namespace std;

constexpr int maxn=2e5 + 5;
int pop[maxn],rep[maxn];
long long sum[maxn];
bool added[maxn],bad[maxn];

vector<int> g[maxn];

int Find(int v){
    if (rep[v]!=v){
        int r=Find(rep[v]);
        if (bad[rep[v]]) bad[v]=true;
        rep[v]=r;
    }
    return rep[v];
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n,m;
    cin>>n>>m;

    for (int i=1;i<=n;i++) cin>>pop[i];
    for (int i=0;i<m;i++){
        int a,b;
        cin>>a>>b;
        g[a].push_back(b);
        g[b].push_back(a);
    }

    for (int i=1;i<=n;i++){
        rep[i]=i;
        sum[i]=pop[i];
    }

    vector<int> vil(n);
    iota(vil.begin(),vil.end(),1);
    sort(vil.begin(),vil.end(),[&](int a,int b){
        return pop[a]<pop[b];
    });

    for (int i=0;i<n;i++){
        int v=vil[i];
        for (int u:g[v]){
            if (!added[u]) continue;
            int ru=Find(u);
            int rv=Find(v);
            if (ru==rv) continue;

            rep[ru]=rv;
            sum[rv]+=sum[ru];

            if (sum[ru]<pop[v]) bad[ru]=true;
        }
        added[v]=true;
    }

    for (int i=1;i<=n;i++){
        Find(i);
        if (bad[i]) cout<<0;
        else cout<<1;
    }
    cout<<"\n";

    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...