제출 #842201

#제출 시각아이디문제언어결과실행 시간메모리
842201ainta참나무 (IOI23_beechtree)C++17
100 / 100
247 ms88932 KiB
#include "beechtree.h" #include <bits/stdc++.h> using namespace std; #define rng(i,a,b) for(int i=int(a);i<=int(b);i++) #define rep(i,b) rng(i,0,b-1) #define gnr(i,b,a) for(int i=int(b);i>=int(a);i--) #define per(i,b) gnr(i,b-1,0) #define pb push_back #define eb emplace_back #define fi first #define se second #define bg begin() #define ed end() #define all(x) x.bg,x.ed #define si(x) int(x.size()) template<class t> using vc=vector<t>; template<class t> using vvc=vc<vc<t>>; typedef long long ll; using pii=pair<int,int>; using vi=vc<int>; using uint=unsigned; using ull=unsigned long long; using pil=pair<int,ll>; using pli=pair<ll,int>; using pll=pair<ll,ll>; using t3=tuple<int,int,int>; ll rand_int(ll l, ll r) { //[l, r] #ifdef LOCAL static mt19937_64 gen; #else static mt19937_64 gen(chrono::steady_clock::now().time_since_epoch().count()); #endif return uniform_int_distribution<ll>(l, r)(gen); } #define N_ 201000 int n, m, w[N_], CC[N_],par[N_], CK[N_], Num[N_]; vi E[N_]; vi ans; map<int,int>D[N_], G[N_]; void DFS(int a){ CC[a]=1; set<int>Set; for(auto &x:E[a]){ DFS(x); Set.insert(w[x]); CC[a]+=CC[x]; } if(si(Set) != si(E[a])){ CK[a]=1; } } int Go(int a){ if(!si(E[a])){ Num[a] = a; D[a][CC[a]] = a; return 1; } for(auto &t:E[a]){ ans[t] = Go(t); //printf("%d %d\n",t,ans[t]); } if(CK[a]){ return 0; } int x = -1, Mx = -1; for(auto &t:E[a]){ if(!ans[t])return 0; if(Mx <CC[t]){ Mx=CC[t]; x=t; } } int px = Num[x]; Num[a]=px; for(auto &y:E[a]){ if(y==x)continue; int py = Num[y]; for(auto &[c,u] : D[py]){ if(c==1)continue; auto it = D[px].lower_bound(c); int v = it->se; int vv; if(it->fi == c)vv = v; else{ it--; vv=it->se; } for(auto &z: E[u]){ if(!G[v].count(w[z]) || CC[G[v][w[z]]] < CC[z])return 0; } for(auto &z: E[vv]){ if(!G[u].count(w[z]) || CC[G[u][w[z]]] < CC[z])return 0; } } for(auto &[c,u] : D[py]){ D[px][c]=u; } } auto it = D[px].end();it--; int u = it->se; for(auto &z: E[u]){ if(!G[a].count(w[z]) || CC[G[a][w[z]]] < CC[z])return 0; } D[px][CC[a]]=a; return 1; } std::vector<int> beechtree(int N, int M, std::vector<int> P, std::vector<int> C) { n=N, m=M; ans.resize(n); rep(i,n){ CK[i]=0; E[i].clear(); } map<int,int>Map; int c=0; rng(i,1,n-1){ par[i]=P[i]; E[P[i]].pb(i); if(!Map.count(C[i])){ Map[C[i]]=++c; } } m=c; rng(i,1,n-1){ C[i]=Map[C[i]]; w[i]=C[i]; G[P[i]][w[i]]=i; } DFS(0); ans[0] = Go(0); return ans; }
#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...