Submission #1305727

#TimeUsernameProblemLanguageResultExecution timeMemory
1305727thesentroStranded Far From Home (BOI22_island)C++20
100 / 100
257 ms58196 KiB
/*
 _____ _          ____             _             
|_   _| |__   ___/ ___|  ___ _ __ | |_ _ __ ___  
  | | | '_ \ / _ \___ \ / _ \ '_ \| __| '__/ _ \ 
  | | | | | |  __/___) |  __/ | | | |_| | | (_) |
  |_| |_| |_|\___|____/ \___|_| |_|\__|_|  \___/ 
*/
 
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
#define ll long long
ll mod = 1e9+7;
//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
ll binpow(ll a, ll b)
{
    ll res = 1;
    while (b>0)
    {
        if (b&1)
            res = (res*a)%mod;
        a = (a*a)%mod;
        b>>=1;
    }
    return res;
}
ll gcd(ll x, ll y)
{
    if (y==0)
        return x;
    return gcd(y, x%y);
}
ll maxi =505050;
vector<vector<ll>>g(maxi);
vector<ll>vis(maxi, 0), v(maxi);
struct DSU
{
    vector<ll>e;
    vector<vector<ll>>ans;
    vector<ll>val;
    void init(ll n)
    {
        e.resize(n+1, -1);
        val.resize(n+1);
        ans.resize(n+1);
        for (int i=1 ; i<=n ;i++){
            val[i] = v[i];
            ans[i].push_back(i);}
    }
    ll find (ll x)
    {
        if (e[x]<0)
            return x;
        return e[x] = find(e[x]);
    }
    bool merge(ll x, ll y)
    {
        y = find(y);
        if (v[x]>val[y])
            ans[y].clear();
        x = find(x);
        if (x==y)
            return false;
        if (ans[x].size()<ans[y].size()) swap(x,y);
        for (auto i:ans[y]) ans[x].push_back(i);
        ans[y].clear();
        val[x] += val[y];
        e[x] += e[y];
        e[y] = x;
        return true;
    }
};
void solve()
{   
    ll n,m;
    cin>>n>>m;
    for (int i=1 ; i<=n ;i++)
        cin>>v[i];
    vector<pair<ll,ll>>vp;
    vector<vector<ll>>adj(n+1);
    for (int i=1 ; i<=m ; i++)
    {
        ll x,y;
        cin>>x>>y;
        if (v[x]>v[y])
            adj[x].push_back(y);
        else
            adj[y].push_back(x);
    }
    for (int i=1 ; i<=n ; i++) vp.push_back({v[i], i});
    sort(vp.begin(), vp.end());
    DSU dsu;
    dsu.init(n);
    for (auto it:vp)
    {
        ll x = it.second;
        for (auto i:adj[x])
            dsu.merge(x, i);
        // cout<<"Hmm"<<" "<<x<<endl;
    }
    // cout<<"Salam"<<endl;
    string s(n, '0');
    for (int i=1 ; i<=n ; i++)
    {
        for (auto j:dsu.ans[i])
            s[j-1] = '1';
        // cout<<i<<"    ";
        // for (auto j:dsu.ans[i]) cout<<j<<" ";
        // cout<<endl;
    }   
    cout<<s<<endl;
}
int main()
{
    ll tt = 1;
    // cin>>tt;
    while (tt--)
    {
        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...