제출 #757837

#제출 시각아이디문제언어결과실행 시간메모리
757837abcvuitunggioStranded Far From Home (BOI22_island)C++17
100 / 100
432 ms31676 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct edge{
    int u,v;
}e[200001];
int n,m,p[200001],a[200001],cnt[200001];
set <int> s[200001];
string res;
int f(int i){
    return (p[i]==i?i:p[i]=f(p[i]));
}
void unite(int u, int v){
    int w=max(cnt[u],cnt[v]);
    u=f(u);
    v=f(v);
    if (u==v)
        return;
    if (a[u]<w)
        s[u].clear();
    if (a[v]<w)
        s[v].clear();
    if (s[u].size()<s[v].size())
        swap(u,v);
    a[u]+=a[v];
    p[v]=u;
    for (int i:s[v])
        s[u].insert(i);
    s[v].clear();
}
int32_t main(){
    ios_base::sync_with_stdio(NULL);cin.tie(nullptr);
    cin >> n >> m;
    for (int i=1;i<=n;i++){
        cin >> a[i];
        cnt[i]=a[i];
        p[i]=i;
        res+='0';
        s[i].insert(i);
    }
    for (int i=0;i<m;i++)
        cin >> e[i].u >> e[i].v;
    sort(e,e+m,[](edge x, edge y){return max(a[x.u],a[x.v])<max(a[y.u],a[y.v]);});
    for (int i=0;i<m;i++)
        unite(e[i].u,e[i].v);
    for (int i:s[f(1)])
        res[i-1]='1';
    cout << res;
}
#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...