Submission #993970

#TimeUsernameProblemLanguageResultExecution timeMemory
993970MarwenElarbiStranded Far From Home (BOI22_island)C++17
100 / 100
225 ms45728 KiB
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define ll long long
#define pb push_back
#define ii pair<int,int>
const int nax=2e5+5;
vector<int> adj[nax];
vector<int> newadj[nax];
int tab[nax];
int parent[nax];
long long sz[nax];
int ans[nax];
int vis[nax];
int find(int x){
    if(parent[x]==x) return x;
    return parent[x]=find(parent[x]);
}
bool sameset(int x,int y){
    return find(x)==find(y);
}
void joinset(int x,int y){
    x=find(x);
    y=find(y);
    parent[x]=y;
    sz[y]+=sz[x];
}
bool compare(int x,int y){
    if(tab[x]!=tab[y]) return tab[x]>tab[y];
    else return x>y;
}
void dfs(int x,int p){
    //cout <<newadj[x].size()<<endl;
    for(auto u:newadj[x]){
        if(u==p) continue;
        if(sz[u]<tab[x]) continue;
        ans[u]=1;
        dfs(u,x);
    }
}
int main(){
    int n,m;
    cin>>n>>m;
    vector<pair<int,int>> cur(n);
    for (int i = 0; i < n; ++i)
    {
        parent[i]=i;
        cin>>tab[i];
        sz[i]=tab[i];
        cur[i]={tab[i],i};
    }
    for (int i = 0; i < m; ++i)
    {
        int x,y;
        cin>>x>>y;
        x--;y--;
        adj[x].pb(y);
        adj[y].pb(x);
    }
    sort(cur.begin(),cur.end());
    for (int i = 0; i < n; ++i)
    {
        sort(adj[i].begin(),adj[i].end(),compare);
    }
    for (int t = 0; t < n; ++t)
    {
        int i=cur[t].se;
        vis[i]=true;
        for(auto u:adj[i]){
            u=find(u);
            //cout <<i<<" "<<u<<endl;
            if(!vis[u]||sameset(i,u)) continue;
            //cout <<i<<" "<<u<<" "<<sz[u]<<" "<<tab[i]<<endl;
            if(sz[u]>=tab[i]){
                newadj[i].pb(u);
            }
            joinset(u,i);
        }
        sz[i]=sz[find(i)];
    }
    ans[cur[n-1].se]=true;
    dfs(cur[n-1].se,-1);
    for (int i = 0; i < n; ++i)
    {
        cout <<ans[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...