城市建设模拟游戏网站360优化大师官方下载最新版
城市建设模拟游戏网站,360优化大师官方下载最新版,如何选择电商网站建设,招聘网站模板页正题
题目链接:https://uoj.ac/problem/84 题目大意
有nnn个点的一棵树#xff0c;111为根#xff0c;两个人从根节点往下走#xff08;只能从深度小的点走到深度大的点#xff09;。
两个人每一秒都可以一条边#xff08;也可以不移动#xff09;#xff0c;或者不消…正题
题目链接:https://uoj.ac/problem/84 题目大意
有nnn个点的一棵树111为根两个人从根节点往下走只能从深度小的点走到深度大的点。
两个人每一秒都可以一条边也可以不移动或者不消耗时间将一个人传送到另一个人那里。
求遍历整棵树需要的最少时间。
1≤n≤5×1061\leq n\leq 5\times 10^61≤n≤5×106 解题思路
什么神仙题。
首先考虑到肯定存在一种方案使得一个人不需要使用传送因为显然两个人都需要使用传送的方案可以通过交换两个人的某些路径得到有一个人不需要传送的方案。
那么说明其中一个人的路径肯定是一条链我们将这个人称之为本体另一个人称为分身。
然后一个粗暴的想法是dpdpdp出一条路径然后本体每走到一个点就等分身遍历完除了链上的其他子树再往下一个节点走。设fif_ifi表示走到节点iii的答案。
但是这样显然是会出问题的对于节点xxx不一定是从它的父亲处转移的因为两个人可以同时移动当分身最后一次传送后本体可以和分身一起移动然后本体在下一个路口等分身传送。
让本体等分身是一种可能更赚的方案如图边长代指了中间省略的点数量级别 显然当本体等待分身遍历完1∼51\sim 51∼5之后让本体和分身分别走向444和333是更优的做法。
可以相当于在链上选择一些关键点本体只有在关键点时才等待并且分身最后遍历最深的叶子时本体同时出发。而关键点不连续的条件只有本体等分身的时才会出现也就是分身最后遍历的叶子深度比下一个关键点的深度要大。
而且显然地如果出现了这种情况那么选择另一个深度更小的祖先作为上一个关键点不可能更优因为会走同一段
所以我们只需要对于每个节点xxx找到第一个祖先yyy满足yyy的子树除去xxx的子树后存在一个深度比xxx大的节点记为sfxsf_xsfx。
那么每个节点只需从sfxsf_xsfx转移即可如果找不到sfsfsf的节点显然对于这样的节点它的父节点只会有一个子节点那么令fxffax1f_xf_{fa_x}1fxffax1即可。
问题是如何快速的求出每个sfxsf_xsfx注意到对于一个处理好的子树xxx只有可能有一段连续的链没有sfxsf_xsfx如图红色箭头所指部分 所以我们只需要从小往上处理维护每个处理好的子树的sfsfsf为000的链。
然后两棵子树的时候我们直接暴力合并这些部分即可因为合并完之后肯定只会留下长的那条链多出来的部分。
时间复杂度O(n)O(n)O(n) code
#includecstdio
#includecstring
#includealgorithm
#define ll long long
using namespace std;
const ll N5e610;
ll n,ans,deg[N],dep[N],fa[N],sf[N];
ll siz[N],sum[N],mx[N],nxt[N],f[N];
char s[N1];
void addl(ll x,ll y){deg[x];fa[y]x;dep[y]dep[x]1;return;
}
signed main()
{scanf(%lld,n);if(n1)return puts(0)0;scanf(%s,s1);for(ll i1,now0,cnt0;i2*n;i){if(s[i]()cnt,addl(now,cnt),nowcnt;else nowfa[now];}for(ll in;i1;i--){if(!deg[i])siz[i]1,sum[i]mx[i]dep[i];ll x,y;for(xi;xdep[x]mx[fa[i]];xnxt[x])sf[x]fa[i];for(ynxt[fa[i]];ydep[y]mx[i];ynxt[y])sf[y]fa[i];nxt[fa[i]]xy;sum[fa[i]]sum[i];siz[fa[i]]siz[i];mx[fa[i]]max(mx[fa[i]],mx[i]);}f[1]0;ansn*n100;for(ll i2;in;i){f[i]n*n100;ll xsf[i];if(x)f[i]f[x]sum[x]-sum[i]-dep[x]*(siz[x]-siz[i]);if(deg[fa[i]]1)f[i]min(f[i],f[fa[i]]1);if(!deg[i])ansmin(ans,f[i]);}printf(%lld\n,ans);return 0;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/91964.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!