제출 #1360680

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

const ll N=801;
vector<ll>g[N];
ll tin[N],tout[N],ti,nd;
ll n,k,m;
ll dep[N],mx[N];

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

ll vs[N];
void mark(ll u,ll p){
	vs[u]=1;
	for(ll v:g[u]){
		if(v!=p)mark(v,u);
	}
}

array<ll,2>rn[N];
vector<ll>d[N];
const ll K=20;
ll f[(1<<K)];

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);
    }

    dfs(1,0);
    for(ll v:g[1]){
    	if(mx[v]<=k)mark(v,1);
    }

    /*nd=n;
    for(int i=2;i<=n;++i){
    	if(g[i].size()==1&&dep[i]<=K){
    		g[i].push_back(++nd);
    		g[nd].push_back(i);
    	}
    }
    n=nd;*/
    ti=0;
    dep[1]=-1;
    dfs(1,0);
    vector<array<ll,2>>leaf;
 	for(int i=2;i<=n;++i){
 		if(vs[i])continue;
 		if(g[i].size()==1){
 			//cout<<i<<endl;
 			leaf.push_back({tin[i],i});
 		}
 	}

 	m=leaf.size();


 	//cout<<"ALFA"<<endl;

 	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};
 	}

 	//cout<<"BETA"<<endl;

 	ll mxD=0;
 	for(int i=1;i<=n;++i){
 		if(vs[i])continue;
 		mxD=max(mxD,dep[i]);
 	}

 	ll U=min(K,mxD+1);

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

 	//cout<<m<<endl;

 	//cout<<"GAMA"<<endl;

 	sort(lk.begin(),lk.end());
 	for(auto[l,r,u]:lk){
 		if(vs[u])continue;
 		ll d=dep[u];
 		if(d>=U||d<0)continue;
 		for(ll msk=0;msk<(1<<U);++msk){
			if(msk&(1<<d))continue;
			if(f[msk]!=l-1)continue;
			f[msk|(1<<d)]=max(f[msk|(1<<d)],r);
		}
 	}

 	//cout<<"TETA"<<endl;

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

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