Submission #951781

#TimeUsernameProblemLanguageResultExecution timeMemory
951781LudisseyStranded Far From Home (BOI22_island)C++14
100 / 100
217 ms36224 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
#define sz(a) (int)a.size()
const int mod=1e9+7;
vector<int> parent;
vector<vector<int>> neigh;
vector<bool> poss;
vector<int> sz;
vector<int> sum;
vector<int> v;
vector<vector<int>> child;


int getParent(int a){
    if(parent[a]==a) return a;
    return parent[a]=getParent(parent[a]);
}

void unite(int a, int b){
    a=getParent(a); b=getParent(b);
    if(a==b) return;
    if(sum[a]<sum[b]) swap(a,b);
    sz[a]+=sz[b];
    sum[a]+=sum[b];
    parent[b]=a;
    child[a].push_back(b);
}
void deact(int a){
    poss[a]=false;
    for (auto u : child[a]) deact(u);
}


signed main() {
    ios_base::sync_with_stdio(false); cin.tie(nullptr);
    int N,M; cin >> N >> M;
    sz.resize(N,1); poss.resize(N,true); parent.resize(N); neigh.resize(N); v.resize(N); sum.resize(N); child.resize(N);
    priority_queue<pair<int,int>> pq;
    for (int i = 0; i < N; i++) { 
        cin >> v[i]; parent[i]=i; sum[i]=v[i]; pq.push({-v[i], i}); 
    }
    for (int i = 0; i < M; i++) { 
        int u,vs;  cin >> u >> vs;
        neigh[u-1].push_back(vs-1); 
        neigh[vs-1].push_back(u-1);
    }
    while(!pq.empty()){
        int i=pq.top().second; pq.pop();
        for (auto u:neigh[i])
        {
            if(v[u]<=v[i]) {
                if(sum[getParent(u)]<v[i]) {
                    deact(getParent(u));
                }
                unite(i,u);
            }
        }
        

    }
    for (int i = 0; i < N; i++){
        cout << poss[i] << "";
    }
    cout << "\n";
    return 0;
}
#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...