제출 #1360702

#제출 시각아이디문제언어결과실행 시간메모리
1360702nikolashamiBurza (COCI16_burza)C++20
160 / 160
7 ms1616 KiB
#include<bits/stdc++.h>
using namespace std;
using ll=long long;

#pragma GCC optimize("O3")
const ll N=405;
vector<ll>g[N];
ll tin[N],tout[N],ti;
ll n,k,m;
ll dep[N],par[N];

void dfs(ll u,ll p){
	tin[u]=++ti;
	par[u]=p;
	for(ll v:g[u]){
		if(v!=p){
			dep[v]=dep[u]+1;
			dfs(v,u);
		}
	}
	tout[u]=++ti;
}

ll vs[N];

array<ll,2>rn[N];
const ll K=22;
ll f[(1<<K)];
ll er[K][N];

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    cin>>n>>k;
    for(int i=1,u,v;i<n;++i){
    	cin>>u>>v;
    	g[u].push_back(v);
    	g[v].push_back(u);
    }

    if(k>=20){
    	cout<<"DA";return 0;
    }

    dfs(1,0);
    fill(vs,vs+N,1);
    vector<array<ll,2>>leaf;
   	for(int i=1;i<=n;++i){
   		if(dep[i]!=k)continue;
   		leaf.push_back({tin[i],i});
   		ll cur=i;
   		while(cur){
   			vs[cur]=0;
   			cur=par[cur];
   		}
   	}

 	m=leaf.size();
 	sort(leaf.begin(),leaf.end());
 	for(int i=1;i<=n;++i){
 		if(vs[i])continue;
 		ll j1=lower_bound(leaf.begin(),leaf.end(),array<ll,2>({tin[i],-1}))-leaf.begin();
 		ll j2=lower_bound(leaf.begin(),leaf.end(),array<ll,2>({tout[i],-1}))-leaf.begin()-1;
 		++j1,++j2;
 		rn[i]={j1,j2};
 	}

 	for(int i=0;i<K;++i){
		fill(er[i],er[i]+N,-1);
 	}

 	vector<array<ll,3>>lk;
 	for(int i=2;i<=n;++i){
 		if(vs[i])continue;
 		lk.push_back({rn[i][0],rn[i][1],i});
 		er[dep[i]-1][rn[i][0]]=max(
 			er[dep[i]-1][rn[i][0]],rn[i][1]);
 	}

 	for(ll msk=0;msk<(1<<k);++msk){
 		for(int i=0;i<k;++i){
 			if(msk&(1<<i))continue;
 			f[msk|(1<<i)]=max(f[msk|(1<<i)],
 				er[i][f[msk]+1]);
 		}
 	}

 	ll ans=1e9;
 	for(ll msk=0;msk<(1<<k);++msk){
		if(f[msk]!=m)continue;
		ans=min(ans,(ll)__builtin_popcountll(msk));
	}

	cout<<(ans<=k?"DA":"NE");
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…