Submission #842198

#TimeUsernameProblemLanguageResultExecution timeMemory
842198gs18115Beech Tree (IOI23_beechtree)C++17
100 / 100
1010 ms95948 KiB
#include"beechtree.h"
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
#define ep emplace
#define eb emplace_back
#define fi first
#define se second
#define all(x) (x).begin(),(x).end()
using namespace std;
typedef long long ll;
typedef pair<int,int>pi;
typedef pair<ll,ll>pl;
const int inf=1e9+7;
const ll INF=1e18;
const int mxn=200010;
vector<pi>adj[mxn];
int sz[mxn];
void dfs(int x)
{
    sz[x]=1;
    for(pi&t:adj[x])
        dfs(t.fi),sz[x]+=sz[t.fi];
    return;
}
bool isinc(const vector<int>&x,const vector<int>&y)
{
    if(x.size()>y.size())
        return 0;
    for(const int&t:x)
        if(!binary_search(all(y),t))
            return 0;
    return 1;
}
vector<int>subtr[mxn];
multimap<int,int>ss[mxn];
map<int,set<pi> >mm[mxn];
int n,m;
int p[mxn],c[mxn];
vector<vector<int> >st;
bool push(int i,int j)
{
    subtr[i].eb(j);
    int x=sz[j];
    auto&s=ss[i];
    {
        auto it=s.ep(x,j);
        if(it!=s.begin())
        {
            auto it2=prev(it);
            if(!isinc(st[it2->se],st[j]))
                return 0;
        }
        auto it2=next(it);
        if(it2!=s.end())
        {
            if(!isinc(st[j],st[it2->se]))
                return 0;
        }
    }
    if(j==0)
        return 1;
    set<pi>&m=mm[i][c[j]];
    int y=sz[p[j]];
    {
        auto it=m.ep(x,y).fi;
        if(it!=m.begin())
        {
            auto it2=prev(it);
            if(it2->se>y||(x!=it2->fi&&y==it2->se))
                return 0;
        }
        auto it2=next(it);
        if(it2!=m.end())
        {
            if(y>it2->se||(x!=it2->fi&&y==it2->se))
                return 0;
        }
    }
    return 1;
}
vector<int>beechtree(int N,int M,vector<int>P,vector<int>C)
{
    n=N,m=M;
    for(int i=0;i<n;i++)
        p[i]=P[i],c[i]=C[i];
    vector<int>isok(n,1);
    for(int i=1;i<n;i++)
        adj[p[i]].eb(i,c[i]);
    st.resize(n);
    for(int i=n;i-->0;)
    {
        for(pi&t:adj[i])
            st[i].eb(t.se);
        sort(all(st[i]));
        auto it=unique(all(st[i]));
        if(it!=st[i].end())
            isok[i]=0;
        if(isok[i]==0&&i>0)
            isok[p[i]]=0;
        st[i].eb(inf);
    }
    dfs(0);
    vector<int>vv;
    for(int i=0;i<n;i++)
        if(isok[i]==1)
            vv.eb(i);
    sort(all(vv),[&](int x,int y){return sz[x]<sz[y];});
    for(int&i:vv)
    {
        if(isok[i]==0)
        {
            if(i>0)
                isok[p[i]]=0;
            continue;
        }
        for(pi&tt:adj[i])
        {
            int t=tt.fi;
        }
        push(i,i);
        for(pi&tt:adj[i])
        {
            int t=tt.fi;
            if(subtr[t].size()>subtr[i].size())
                swap(subtr[t],subtr[i]),
                swap(ss[t],ss[i]),
                swap(mm[t],mm[i]);
            ss[t].clear();
            mm[t].clear();
            for(int&x:subtr[t])
            {
                if(!push(i,x))
                {
                    isok[i]=0;
                    break;
                }
            }
            subtr[t].clear();
            if(isok[i]==0)
                break;
        }
        if(isok[i]==0)
        {
            if(i>0)
                isok[p[i]]=0;
            continue;
        }
    }
    return isok;
}

Compilation message (stderr)

beechtree.cpp: In function 'std::vector<int> beechtree(int, int, std::vector<int>, std::vector<int>)':
beechtree.cpp:121:17: warning: unused variable 't' [-Wunused-variable]
  121 |             int t=tt.fi;
      |                 ^
#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...
#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...