2020.02.03日常总结

P 3478     [ P O I 2008 ] S T A S t a t i o n \color{green}{洛谷P3478\ \ \ [POI2008]STA-Station}

\color{blue}{【题意】:} 给您一棵有 N N 个点的无根树,求一个点,以这个点为根的树时,所有点的深度之和最大。 1 N 1 × 1 0 6 1 \leq N \leq 1 \times 10^6

\color{blue}{【思路】:} 首先,我们求出以 1 1 为根(当然,以其它点为根也可以,毕竟是无根树嘛),求出此时所有点的深度和 S 1 S_1 和子树大小 S i z e x Size_x

考虑从一个点 u u 向下移动到它的儿子 v v 时,总答案有什么变化。很明显, v v 的子树内的节点的深度全部 1 -1 ,而其它的点的深度 + 1 +1 ,即:

S v = S u S i z e v + ( N S i z e v ) = S u + N 2 × S i z e v S_v=S_u-Size_v+(N-Size_v)=S_u+N-2 \times Size_v

有了它,我们就可以 O ( N ) O(N) 处理啦——

\color{blue}{【代码】:}
在这里插入图片描述
在这里插入图片描述
\color{blue}{【语法点透析】:}

  • add(read(),read()):这句话根本不像我们想象的那么“单纯”,它是反过来的。什么意思?即输入1 2,实际上运行的是add(2,1),而不是add(1,2)
  • e[N<<1]:为什么要两倍空间?不是已经确定了根为 1 1 吗?其实,哪怕我们知道根是什么,我们仍然不能在输入时就确定这棵树的形态,所以我们仍然不知道谁是父亲谁是儿子,所以还是得两倍空间。
发布了103 篇原创文章 · 获赞 4 · 访问量 6736

猜你喜欢

转载自blog.csdn.net/ZHUYINGYE_123456/article/details/104160746
今日推荐