제출 #1351315

#제출 시각아이디문제언어결과실행 시간메모리
1351315NewtonabcStranded Far From Home (BOI22_island)C++20
100 / 100
133 ms44480 KiB
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+10;
int pa[N],sz[N],ret[N];
ll a[N],val[N];
vector<int> adj[N],cp[N],f[N];
vector<ll> cn;
int fd(ll x){return lower_bound(cn.begin(),cn.end(),x)-cn.begin();}
int root(int x){if(pa[x]==x) return x; return root(pa[x]);}
void merge(int u,int v){
    if(root(u)==root(v)) return;
    int ru=root(u),rv=root(v);
    if(sz[ru]>sz[rv]) swap(ru,rv),swap(u,v);
    pa[ru]=rv;
    sz[rv]+=sz[ru];
    val[rv]+=val[ru];
    for(auto x:cp[ru]) cp[rv].push_back(x);
    cp[ru].clear();
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n,m; cin>>n >>m;
    for(int i=1;i<=n;i++) pa[i]=i,sz[i]=1;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        cn.push_back(a[i]);
        cp[i].push_back(i);
        val[i]=a[i];
    }
    for(int i=0;i<m;i++){
        int u,v; cin>>u >>v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    sort(cn.begin(),cn.end());
    cn.erase(unique(cn.begin(),cn.end()),cn.end());
    for(int i=1;i<=n;i++) f[fd(a[i])].push_back(i);
    int sz=cn.size();
    for(int i=0;i<sz;i++){
        for(auto u:f[i]){
            for(auto v:adj[u]){
                if(a[v]>a[u]) continue;
                int ru=root(u),rv=root(v);
                if(val[rv]<a[u]){
                    cp[rv].clear();
                }
                merge(u,v);
            }
        }
    }
    int rt=root(1);
    for(auto x:cp[rt]) ret[x]=1;
    for(int i=1;i<=n;i++) cout<<ret[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...