제출 #1241348

#제출 시각아이디문제언어결과실행 시간메모리
1241348mychecksedad참나무 (IOI23_beechtree)C++17
9 / 100
80 ms58180 KiB
#include "beechtree.h"
#include<bits/stdc++.h>
using namespace std;
#define vi vector<int>
#define pii pair<int,int>
#define ff first
#define ss second
#define all(x) x.begin(),x.end()
#define pb push_back
const int N = 2e5+100;

vi T[N];
vector<pii> g[N];
vi res;

bool check_cover(vi &x, vi &y){
  for(int u: y){
    int pos = lower_bound(all(x), u) - x.begin();
    if(pos < (int)x.size() && x[pos] == u) continue;
    return false;
  }
  return true;
}

void dfs(int v){
  bool ok = true;
  vi col;
  if(g[v].empty()){
    res[v] = 1;
    return;
  }
  for(auto [u, cl]: g[v]){
    dfs(u);
    if(res[u] == 0){
      ok = false;
    }
    col.pb(cl);
  }
  if(!ok){
    res[v] = 0;
    return;
  }
  if(v != 0){
    int sz = col.size();
    sort(all(col));
    col.erase(unique(all(col)), col.end());
    T[v] = col;
    if((int)col.size() < sz){
      res[v] = 0;
      return;
    }
    res[v] = 1;
  }else{
    int sz = col.size();
    sort(all(col));
    col.erase(unique(all(col)), col.end());
    T[v] = col;
    if((int)col.size() < sz){
      res[v] = 0;
      return;
    }
    sort(all(g[v]), [&](const pii &x, const pii &y){
      return (int)T[x.ff].size() > (int)T[y.ff].size();
    });
    vector<vi> S;
    S.pb(T[v]);
    for(auto [u, cl]: g[v]) S.pb(T[u]);
    for(int i = 1; i < (int) S.size(); ++i){
      if(!check_cover(S[i-1], S[i])){
        res[v] = 0;
        return;
      }
    }
    res[v] = 1;
  }
}

std::vector<int> beechtree(int n, int m, std::vector<int> P, std::vector<int> C)
{
  for(int i = 0; i < n; ++i) T[i].clear(), g[i].clear();
  res.clear();
  res.resize(n);

  for(int i = 1; i < n; ++i) g[P[i]].pb({i, C[i]});

  dfs(0);

  return res;
}
#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...