题解 AT_ddcc2017_final_e 足のばし
洛谷。
题意
有一棵
对于
分析
为了行文方便,下文中原直径长度为
首先可以想到的是先将整棵树的直径处理出来,然后对于直径上的节点可以先进行在不影响直径长度下的最长补充,这是我们在这个直径下的最多的
接下来继续分析,我们会发现,显然,再操作一次后,直径必然增加
这是我们的整体的贪心思路,接下来是实现。
首先是我们发现,在直径上,有个特殊的节点,那就是我们直径的中点,中点的链接的各个节点在补全后应当最大长度是一个相同的值,但是这个中点却有可能是在一条边上,因此,我们引进一个中间节点,将一条边
此时,问题是我们的补全,好发现的,我们最优条件下就是将所有操作加在叶子结点链接的那一条边上,因此我们可以操作的最大数就是(叶子结点的数量
接下来就是扩张直径。
从上边可以看出,我们对某一条操作后(令其链接的叶子结点方向的与中心结点相连的结点为
我们就可以维护出每一次增长直径是的最大操作数,可以拿下
那么
可以发现,假如我们当前结点是
#include <bits/stdc++.h> #define int long long using namespace std; const int N = 4e5+5; const int M = 2e6+5; inline int read() { int x; scanf("%lld",&x); return x; } int n, m,cnt,dep[N],lf[N],fa[N],tot,f[M]; vector<int > lj[N]; inline void add(int u,int v) { lj[u].push_back(v),lj[v].push_back(u); } inline void dfs(int now,int fath) { dep[now]=dep[fa[now]=fath]+1,lf[now]=0; if(lj[now].size()==1&&fath) lf[now]=1,tot+=dep[now]; for(auto to:lj[now]) if(to!=fath) dfs(to,now),lf[now]+=lf[to]; } int st[M],top; inline void redfs(int now,int fath) { int mxto=0,mx=0; for(auto to:lj[now]) if(mx<lf[to]) mx=lf[to],mxto=to; st[++top]+=mx,tot+=mx; if(mxto==fath) return ; lf[now]-=lf[mxto],lf[mxto]+=lf[now]; redfs(mxto,now); } signed main() { freopen("V.in","r",stdin); freopen("V.out","w",stdout); n=read(),m=n*2-1; for(int i=1; i<n; ++i) { int u=read(),v=read(); add(u,n+i),add(v,n+i); } dep[0]=-1,tot=0; dfs(1,0); int A=1,B; for(int i=1; i<=m; ++i) if(dep[A]<dep[i]) A=i; dfs(B=A,0); for(int i=1; i<=m; ++i) if(dep[A]<dep[i]) A=i; int md=tot=0,dis=dep[A]/2; for(int now=A; now; now=fa[now]) if(dep[A]/2==dep[now]) md=now; dfs(md,0); tot=f[0]=(lf[md]*dis-tot)/2; redfs(md,0); for(int i=1; i<=top; ++i) f[i]=f[i-1]+st[i]; int Q=read(); while(Q--) { int x=read(); if(x<=f[top]) { int res=dis+lower_bound(f,f+top+1,x)-f; cout<<res<<"\n"; } else { int res=dis+top; x-=f[top]; res+=2*(x/(st[top]+st[top-1])); x%=(st[top]+st[top-1]); if(x) ++res; if(x>st[top-1]) ++res; cout<<res<<"\n"; } } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现