Submission #1348684

#TimeUsernameProblemLanguageResultExecution timeMemory
1348684truongdz_top12Stranded Far From Home (BOI22_island)C++20
0 / 100
171 ms59944 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;
}
struct DSU{
     int n;
    vector<int>parent,sz;
    DSU(int _n){
        n=_n;
        parent.assign(n+1,0);
        sz.assign(n+1,1);
        for(int i=1;i<=n;++i)
            parent[i]=i;
    }
    int findV(int v){
        return parent[v]==v?v:parent[v]=findV(parent[v]);
    }
    bool unite(int u,int v){
        u=findV(u);
        v=findV(v);
        if(u==v)
            return false;
        if(sz[u]<sz[v])
            swap(u,v);
        parent[v]=u;
        sz[u]+=sz[v];
        return true;
    }
    bool same(int u,int v){
        return findV(u)==findV(v);
    }
};
int n,m,s[N],up[22][N],lg,cnt;
ll mx[N],sum[N],nxt[N],ans[N],timer,tin[N],tout[N],node[N],p[N];
vector<int>adj[N];
bool active[N];
bool cmp1(int u,int v){
    if(s[u]==s[v])
        return u<v;
    return s[u]<s[v];
}
bool cmp2(int u,int v){
    if(sum[u]==sum[v])
        return u<v;
    return sum[u]>sum[v];
}
int jump(int u,ll k){
    for(int i=lg;i>=0;--i){
        int v=up[i][u];
        if(v&&mx[v]<=k)
            u=v;
    }
    return u;
}
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];
    for(int i=1;i<=m;++i){
        int u,v;
        cin>>u>>v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    for(int u=1;u<=n;++u){
        node[u]=u;
        mx[u]=s[u];
        sum[u]=s[u];
    }
    int cur=n;
    DSU dsu(n<<1|1);
    sort(node+1,node+1+n,cmp1);
    for(int i=1;i<=n;++i){
        int u=node[i];
        tin[u]=++timer;
        active[u]=true;
        vector<int>child;
        for(int v:adj[u])
            if(active[v]){
                v=dsu.findV(v);
                if(tin[v]!=timer){
                    tin[v]=timer;
                    child.push_back(v);
                }
            }
        if(child.empty())
            continue;
        ++cur;
        dsu.parent[cur]=cur;
        mx[cur]=s[u];
        sum[cur]=s[u];
        p[cur]=0;
        for(int v:child){
            dsu.parent[v]=cur;
            p[v]=cur;
            sum[cur]+=sum[v];
        }
        dsu.parent[u]=cur;
        p[u]=cur;
        sum[cur]+=sum[u];
        tout[u]=timer;
    }
    int root=dsu.findV(1);
    for(int u=1;u<=cur;++u)
        up[0][u]=p[u];
    while((1<<lg)<=cur)
        ++lg;
    for(int i=1;i<=lg;++i)
        for(int u=1;u<=cur;++u)
            up[i][u]=up[i-1][up[i-1][u]];
    for(int u=1;u<=cur;++u){
        nxt[u]=jump(u,sum[u]);
        node[u]=u;
    }
    sort(node+1,node+1+cur,cmp2);
    vector<char>ans(cur+1,'0');
    for(int i=1;i<=cur;++i){
        int u=node[i];
        if(nxt[u]==u){
            if(u==root)
                ans[u]='1';
        }
        else
            ans[u]=ans[nxt[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...