제출 #1350339

#제출 시각아이디문제언어결과실행 시간메모리
1350339tung04885Stranded Far From Home (BOI22_island)C++20
100 / 100
433 ms107584 KiB
#include <bits/stdc++.h>
using namespace std;
#define MAX 200200
#define int long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define fi first
#define se second
#define all(a) (a).begin(),(a).end()
#define __buitin_popcount __builtin_popcountll
#define BIT(x,i) (((x)>>(i))&1ll)
#define MASK(i) (1ll<<(i))

template<class X,class Y> bool maximize(X &x,Y y)
{
    if(x<y)
    {
        x=y;
        return 1;
    }
    return 0;
}

template<class X,class Y> bool minimize(X &x,Y y)
{
    if(y<x)
    {
        x=y;
        return 1;
    }
    return 0;
}

const int inf=1e9+412009;
const int INF=2e18+412009;

struct DSU
{
    vector<int> par,sz,sum;

    DSU(int n=0,int a[]={})
    {
        par.assign(n+1,0);
        sz.assign(n+1,1);
        sum.assign(n+1,0);

        for(int i=1;i<=n;i++) par[i]=i,sum[i]=a[i];
    }

    int find_set(int a)
    {
        if(par[a]==a) return a;

        int p=find_set(par[a]);

        par[a]=p;

        return p;
    }

    bool union_set(int a,int b)
    {
        a=find_set(a);
        b=find_set(b);

        if(b==a) return 0;

        par[b]=a;

        sz[a]+=sz[b];
        sum[a]+=sum[b];

        return 1;
    }

    int get_sum(int a)
    {
        a=find_set(a);

        return sum[a];
    }

    int get_size(int a)
    {
        a=find_set(a);

        return sz[a];
    }
};

struct EDGE
{
    int u,v;

    int other(int x)
    {
        assert(x==u||x==v);

        return u+v-x;
    }
};

EDGE edge[MAX];
int n,m;
int sz[MAX];
vector<int> adj[MAX];
DSU dsu;

void nhap()
{
    cin>>n>>m;

    for(int i=1;i<=n;i++) cin>>sz[i];

    for(int i=1;i<=m;i++)
    {
        int u,v;

        cin>>u>>v;

        edge[i]={u,v};

        adj[u].push_back(i);
        adj[v].push_back(i);
    }
}

map<int,vector<int>> cursz,mp ;

bool ans[MAX]={};

void solve()
{
    dsu=DSU(n,sz);

    for(int i=1;i<=n;i++)
    {
        cursz[sz[i]].push_back(i);
        mp[sz[i]].push_back(i);
    }

    for(auto i:cursz)
    {

        for(int u:mp[i.fi]) for(int id:adj[u])
        {
            int v=edge[id].other(u);

            if(sz[v]<=i.fi) dsu.union_set(u,v);
        }

        for(int u:i.se)
        {
            int new_weight=dsu.get_sum(u);

            if(new_weight>i.fi) cursz[new_weight].push_back(u);
            else if(dsu.get_size(u)==n) ans[u]=1;
        }
    }


    for(int i=1;i<=n;i++) cout<<ans[i];
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);cout.tie(nullptr);

    nhap();
    solve();

    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...