Submission #1348698

#TimeUsernameProblemLanguageResultExecution timeMemory
1348698truongdz_top12Stranded Far From Home (BOI22_island)C++20
0 / 100
1095 ms33592 KiB
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
#define ll long long
#define all(x) x.begin(),x.end()
#define file(name) freopen(name".inp","r",stdin);freopen(name".out","w",stdout);
using namespace std;
const int MOD=1e9+7;
const int inf=1e9+36;
const ll INF=1e18+36;
const long double EPS=1e-15;
const int N=1e6+5;
int minmize(int a,int b){
    return a<b?a:b;
}
int maxmize(int a,int b){
    return a>b?a:b;
}
ll Minmize(ll a,ll b){
    return a<b?a:b;
}
ll Maxmize(ll a,ll b){
    return a>b?a:b;
}
int n,m,s[N],node[N],ans[N];
vector<int>adj[N];
bool active[N];
bool cmp(int u,int v){
    return s[u]<s[v];
}
struct DSU{
     int n;
    vector<int>parent,sz;
    vector<vector<int>>k;
    DSU(int _n){
        n=_n;
        parent.assign(n+1,0);
        sz.assign(n+1,1);
        k.resize(n+1);
        for(int i=1;i<=n;++i){
            parent[i]=i;
            sz[i]=s[i];
            k[i].push_back(i);
        }
    }
    int findV(int v){
        return parent[v]==v?v:parent[v]=findV(parent[v]);
    }
    bool unite(int u,int v,int l){
        u=findV(u);
        v=findV(v);
        if(u==v)
            return false;
        if(sz[u]<sz[v])
            swap(u,v);
        if(sz[v]<l)
            for(int x:k[v])
                ans[x]=0;
        if(k[u].size()<k[v].size())
            swap(k[u],k[v]);
        for(int x:k[v])
            k[u].push_back(x);
        parent[v]=u;
        sz[u]+=sz[v];
        return true;
    }
};
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //file("");
    cin>>n>>m;
    for(int i=1;i<=n;++i){
        cin>>s[i];
        node[i]=i;
        ans[i]=1;
    }
    for(int i=1;i<=m;++i){
        int u,v;
        cin>>u>>v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    sort(node+1,node+1+n,cmp);
    DSU dsu(n);
    for(int i=1;i<=n;++i){
        int u=node[i];
        for(int v:adj[u])
            if(s[v]<=s[u])
                dsu.unite(u,v,s[u]);
    }
    for(int u=1;u<=n;++u)
        cout<<ans[u];
    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...