Submission #668161

#TimeUsernameProblemLanguageResultExecution timeMemory
668161fatemetmhrStranded Far From Home (BOI22_island)C++17
100 / 100
242 ms43836 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

#define all(x) x.begin(), x.end()
#define pb     push_back
#define fi     first
#define se     second

const int maxn5 = 3e5 + 10;

ll s[maxn5], sum[maxn5];
int cmp[maxn5];
bool mark[maxn5], seen[maxn5];
vector <int> adj[maxn5], av[maxn5];
vector <pair<int, int>> ver;

void merge(int a, int b){
    if(av[a].size() < av[b].size())
        swap(a, b);
    for(auto u : av[b]){
        cmp[u] = a;
        av[a].pb(u);
    }
    sum[a] += sum[b];
    av[b].clear();
}

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

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

    for(int i = 0; i < n; i++){
        cin >> s[i];
        ver.pb({s[i], i});
    }
    for(int i = 0; i < m; i++){
        int a, b; cin >> a >> b;
        a--; b--;
        adj[a].pb(b);
        adj[b].pb(a);
    }
    sort(all(ver));
    memset(mark, true, sizeof mark);
    for(int i = 0; i < n; i++){
        cmp[i] = i;
        av[i].pb(i);
        sum[i] = s[i];
    }
    for(auto [val, v] : ver){
        seen[v] = true;
        for(auto u : adj[v]) if(cmp[u] != cmp[v] && seen[u]){
            if(sum[cmp[u]] < s[v])
                for(auto z : av[cmp[u]])
                    mark[z] = false;
            merge(cmp[u], cmp[v]);
        }
    }
    for(int i = 0; i < n; i++)
        cout << mark[i];
    cout << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...