제출 #1305537

#제출 시각아이디문제언어결과실행 시간메모리
1305537HasanV11010238Stranded Far From Home (BOI22_island)C++20
100 / 100
264 ms38964 KiB
#include<bits/stdc++.h>
#define ll long long
#define mod 1000000007
using namespace std;
vector<vector<int>> v;
vector<ll> sbt;
int cur;
struct DSU{
    vector<int> p, ro;
    int cmp;
    DSU(int n){
        p.assign(n + 1, -1);
        ro.assign(n + 1, 0);
        for (int i = 1; i <= n; i++) ro[i] = i;
        cmp = n;
    }
    int find(int x){
        if (p[x] < 0) return x;
        return p[x] = find(p[x]);
    }
    void merge(int a, int b){
        int ora = a, orb = b;
        a = find(a), b = find(b);
        if (a == b) return;
        cmp--;
        if (p[a] > p[b]) swap(a, b), swap(ora, orb);
        if (sbt[ro[a]] >= sbt[orb]){
            v[cur].push_back(ro[a]);
        }
        if (sbt[ro[b]] >= sbt[ora]){
            v[cur].push_back(ro[b]);
        }
        p[a] += p[b];
        p[b] = a;
        sbt[cur] = sbt[ro[a]] + sbt[ro[b]];
        ro[a] = cur;
        cur++;
    }
};
int n;
vector<int> ans;
void dfs(int x){
    if (x <= n) ans[x] = 1;
    for (auto el : v[x]){
        dfs(el);
    }
}
int main(){
    int m, a, b;
    cin>>n>>m;
    sbt.assign(2 * n + 1, 0);
    v.assign(2 * n, vector<int>());
    ans.assign(n + 1, 0);
    for (int i = 1; i <= n; i++) cin>>sbt[i];
    vector<vector<ll>> edg;
    for (int i = 1; i <= m; i++){
        cin>>a>>b;
        edg.push_back({max(sbt[a], sbt[b]), a, b});
    }
    cur = n + 1;
    DSU ds(n);
    sort(edg.begin(), edg.end());
    for (auto el : edg){
        ds.merge(el[1], el[2]);
    }
    if (ds.cmp == 1){
        dfs(cur - 1);
    }
    for (int i = 1; i <= n; i++) cout<<ans[i];
}
#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...