# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
980937 | vjudge1 | 참나무 (IOI23_beechtree) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <algorithm>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
#include <iostream>
#include <cmath>
#include <queue>
#include <set>
#include <string>
#include <cstring>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <iomanip>
#define F first
#define S second
#define PB push_back
using namespace std;
const long long MOD=1e9+7, INF=1e18;
const int INFI=1e9;
typedef long long ll;
typedef pair<int, int> ii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ii> vii;
typedef vector<pair<int, ii>> viii;
typedef vector<vii> vvii;
typedef vector<ll> vll;
typedef vector<vll> vvll;
void getSize(vvii &al, vi &sz, int node=0, int p=0){
for(auto num:al[node]){
if(num.F!=p) getSize(al, sz, num.F, node);
sz[node]+=sz[num.F];
}
}
void getPerm(vvii &al, vi &perm, int node, int p, int index){
perm[index]=node;
for(auto num:al[node])
if(num.F!=p) getPerm(al, perm, num.F, node, ++index);
}
bool check(vi &perm, vi &p, vi &cnt, vi &c, vi &index, int root){
if(perm[0]!=root) return false;
for(int i=1;i<(int)perm.size();i++){
if(cnt[c[perm[i]]]!=index[p[perm[i]]]) return false;
cnt[c[perm[i]]]++;
}
return true;
}
vi beechtree(int n, int m, vi p, vi c)
//int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
/*
int n, m;
cin>>n>>m;
vi p(n), c(n);
for(int i=0;i<n;i++) cin>>p[i];
for(int i=0;i<n;i++) cin>>c[i];
*/
vi ans(n, 0), sz(n, 1);
vvii al(n, vii());
for(int i=0;i<n;i++)
if(i!=0) al[p[i]].PB({i, c[i]});
getSize(al, sz);
for(int i=0;i<n;i++){
if(al[i].size()==0){
ans[i]=1;
continue;
}
vi perm(sz[i]), cnt(m+1, 0), index(n);
getPerm(al, perm, i, p[i], 0);
sort(perm.begin(), perm.end());
do{
for(int j=0;j<sz[i];j++) index[perm[j]]=j;
for(int j=0;j<=m;j++). cnt[j]=0;
if(check(perm, p, cnt, c, index, i)) ans[i]=1;
}while(next_permutation(perm.begin(), perm.end()));
}
//for(int i=0;i<n;i++) cout<<ans[i]<<" ";
return ans;
}