Submission #1104459

#TimeUsernameProblemLanguageResultExecution timeMemory
1104459alexddStranded Far From Home (BOI22_island)C++17
100 / 100
642 ms173524 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 1e18;
int n,m;
int a[200005];
vector<int> con[200005];

int root[200005];
set<int> s[200005],s2[200005];
int sum[200005];
void unite(int x, int y)
{
    x = root[x];
    y = root[y];
    if(x==y)
        return;
    if((int)s2[x].size() < (int)s2[y].size())
        swap(x,y);
    sum[x] += sum[y];
    for(auto it:s[y])
    {
        s[x].insert(it);
    }
    for(auto it:s2[y])
    {
        s2[x].insert(it);
        root[it] = x;
    }
    //cout<<x<<" "<<sum[x]<<" new sum\n";
}
int get_mic(int x, int lim)
{
    if(s[x].upper_bound(lim)==s[x].end())
        return INF;
    return *s[x].upper_bound(lim);
}
int poz[200005];
bool rez[200005];
int from[200005];
signed main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n>>m;
    vector<pair<int,int>> ord;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        ord.push_back({a[i],i});
    }
    int u,v;
    for(int i=1;i<=m;i++)
    {
        cin>>u>>v;
        con[u].push_back(v);
        con[v].push_back(u);
    }
    sort(ord.begin(), ord.end());
    for(int i=0;i<ord.size();i++)
        poz[ord[i].second] = i;
    for(int i=1;i<=n;i++)
    {
        sum[i] = a[i];
        root[i] = i;
        s2[i].insert(i);
        for(int adj:con[i])
        {
            if(poz[adj] > poz[i])
                s[i].insert(poz[adj]);
        }
    }
    for(auto [_,i]:ord)
    {
        //cout<<i<<" ord\n";
        if(poz[i]==n-1)
        {
            rez[i]=1;
            continue;
        }
        for(int adj:con[i])
        {
            if(poz[adj] < poz[i])
            {
                unite(adj,i);
                //cout<<i<<" "<<adj<<" uneste\n";
            }
        }
        int y = ord[get_mic(root[i],poz[i])].second;
        if(sum[root[i]] >= a[y])
        {
            from[i] = y;
        }
        else
        {
            from[i] = -1;
            //cout<<i<<" "<<sum[root[i]]<<" sum\n";
        }
    }
    for(int j=n-2;j>=0;j--)
    {
        int i = ord[j].second;
        if(from[i]==-1)
            rez[i] = 0;
        else
            rez[i] = rez[from[i]];
    }
    for(int i=1;i<=n;i++)
        cout<<rez[i];
    return 0;
}

Compilation message (stderr)

island.cpp: In function 'int main()':
island.cpp:59:18: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |     for(int i=0;i<ord.size();i++)
      |                 ~^~~~~~~~~~~
#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...