Submission #697584

#TimeUsernameProblemLanguageResultExecution timeMemory
697584vjudge1Torrent (COI16_torrent)C++14
100 / 100
116 ms19756 KiB
#include<bits/stdc++.h> 
using namespace std;
const int N=3e5+5;
int n,a,b,u,v,h[N],tot,fa[N],c[N],k,f[N],F[N],G[N],l,r,mid,ans;
struct edge {int to,nxt;}e[N<<1];
void add(int u,int v) 
{
	e[++tot]={v,h[u]};
	h[u]=tot;
}
void dfs(int u)
{
	vector<int> p;int id=0;
	for(int i=h[u];i;i=e[i].nxt)
	{
		int v=e[i].to;
		if(v==fa[u]) continue;
		fa[v]=u;dfs(v);p.push_back(f[v]);
	}
	sort(begin(p),end(p));reverse(begin(p),end(p));
	for(int x:p) id++,f[u]=max(f[u],id+x);
}
bool check(int mid)
{
	int step=mid,l=k,r=k+1;
	for(int i=1;i<=k;i++)
	{
		if(step<F[i]) {l=i-1;break;}
		if(step==F[i]) step-=G[i];
		else step--; 
	}
	step=mid;
	for(int i=k;i>=1;i--)
	{
		if(step<F[i]) {r=i+1;break;}
		if(step==F[i]) step-=G[i];
		else step--; 
	}
	return l+1>=r;
}
int main()
{
	scanf("%d%d%d",&n,&a,&b);
	for(int i=1;i<n;i++)
	{
		scanf("%d%d",&u,&v);
		add(u,v),add(v,u);
	}
	dfs(a);
	while(b!=fa[a]) c[++k]=b,b=fa[b];
	reverse(c+1,c+k+1);
	for(int l=1;l<=k;l++)
	{
		u=c[l];
		int id=0;
		vector<int> p;set<int> s;
		for(int i=h[u];i;i=e[i].nxt)
		{
			int v=e[i].to;
			if(v==fa[u]||v==c[l+1]) continue;
			p.push_back(f[v]);
		}
		sort(begin(p),end(p));reverse(begin(p),end(p));
		for(int x:p) 
		{
			id++,F[l]=max(F[l],id+x);
			s.insert(id);
		}
		s.insert(id+1);
		for(int x:p) s.erase(--s.upper_bound(F[l]-x));
		G[l]=*begin(s);
	}
	l=0,r=n;
	while(l<=r)
	{
		mid=(l+r)>>1;
		if(check(mid)) ans=mid,r=mid-1;
		else l=mid+1;
	}
	printf("%d\n",ans);
	return 0;
}

Compilation message (stderr)

torrent.cpp: In function 'int main()':
torrent.cpp:43:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   43 |  scanf("%d%d%d",&n,&a,&b);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~
torrent.cpp:46:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   46 |   scanf("%d%d",&u,&v);
      |   ~~~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...