首页 > 其他分享 >《 $P5642$ 人造情感 》解题报告

《 $P5642$ 人造情感 》解题报告

时间:2023-10-29 09:44:05浏览次数:34  
标签:sz limits P5642 路径 人造 解题 复杂度 lca sum

究极套路题,挺有意思的 \(qwq\) 。

首先我们记一些东西。

记 \(f(x)\) 为 \(x\) 子树中选出的不交路径权值和最大是多少。

记 \(g(x)\) 为 \(x\) 子树外的不交路径权值和最大是多少。

如果有了这两个东西那么答案就很好计算了。

那么 \(f(1)\) 实际上就是 \(W(U)\) 。

\(---------------------------------\)

考虑如何计算 \(f\) ,算是一个比较典的套路。

我们记 \(sum_u=\sum\limits_{t\in son_u} f_t\)

然后我们考虑把路径挂到 \(lca\) 上。

对于一条路径 \((x_i,y_i,w_i)\) ,假设他的 \(lca\) 为 \(u\) ,那么他对 \(u\) 的贡献是 \(w_i+\sum \limits_{j\in x_i\to y_i(j\not=u)} sum_j-f_j+sum_u\)

相当于把这条路径给去掉后,剩下各个连通块的最大值之和。

最后对这个东西取一个 \(\max\) 就可以得到 \(f_u\)

而这个东西维护的话,用树剖是很容易解决的,可实际上单点加链求和,可以转换成子树加单点求和,这部分复杂度是 \(O(n\log n)\) 的。

\(---------------------------------\)

接下来考虑如何求 \(g\) 。

首先 \(g(1)=0\) 这是显然的,考虑如何从 \(u\) 递推到 \(v\) 。

有三种情况。

  • \(u\) 没有被任何路径经过,\(g_v=g_u+sum_u-f_v\) ,这个也是显然的。

  • \(u\) 被某一条路径经过,记作 \(x_i,y_i,w_i\) ,且 \(lca(x_i,y_i)=u\) ,那么也就是说这条路径经过了 \(u\) 的某两个儿子,记作 \(v_1,v_2\) 。那么这条路径的贡献就是 \(g_u+w_i+\sum \limits_{j\in x_i\to y_i(j\not=u)} sum_j-f_j+sum_u-f_v\) ,那么这个东西可以贡献给除了 \(v1,v2\) 外 \(u\) 的儿子。

  • \(u\) 被某一条路径经过,记作 \(x_i,y_i,w_i\) ,而 \(lca(x_i,y_i)\not =u\) ,假设 \(lca(x_i,y_i)=Q\) 那么也就是说这条路径经过了 \(u\) 的某一个儿子,记作 \(v_1\) ,这条路径的贡献就是 \(g_Q+w_i+\sum \limits_{j\in x_i\to y_i(j\not=u)} sum_j-f_j+sum_u-f_v\) ,然后可以贡献给除了 \(v_1\) 以外的儿子,而且这是对于 \(x_i\to y_i\) 外的路径都是如此,可以用线段树单点修改,而对于查询就查询自己子树外的最大值即可。

具体二操作如何实现,我们按照 \(w_i+\sum \limits_{j\in x_i\to y_i} sum_j-f_j\) 排序,然后枚举找到第一个合法的位置,暴力找就可以了,为什么这样复杂度是对的呢,因为每条路径最多会失败两次,所以实际上是对的。

这部分复杂度也是 \(O(n\log n)\) 的。

\(---------------------------------\)

现在知道了 \(f,g\) 考虑如何计算贡献。

考虑答案形状实际上就是若干个 \(f\) 加上一个 \(g\) ,也就是 \(\sum \limits_{j\in x_i\to y_i(j\not=u)} sum_j-f_j+sum_u+g(fa[lca(x_i,y_i)])+w_i\) 。

容易发现 \(\sum \limits_{j\in x_i\to y_i(j\not=u)} sum_j-f_j+sum_u+g(fa[lca(x_i,y_i)])\) 肯定是 \(\le f_1\) 的。

我们令 \(f_1-\sum \limits_{j\in x_i\to y_i(j\not=u)} sum_j-f_j+sum_u+g(fa[lca(x_i,y_i)])\) ,就可以得到 \(w_i\) 第一个不贡献的位置,也就是临界点,然后加 \(1\) 就是答案。

考虑拆贡献。

每个 \(f_u\) 被贡献,当且仅当 \(fa_u\) 被选了,而 \(u\) 没有被选择,考虑容斥算这个东西的方案数。

先记 \(sz_i\) 表示 \(i\) 的子树大小 \((n\times n-2\times sz_i\times (n-sz_i)-\prod\limits_{t\in son} sz_t^2\times (n-sz_u)^2)\) ,这个就是方案数。

而 \(g\) 也同理。

这个东西复杂度是 \(O(n)\) 的。

总复杂度是 \(O(n\log n)\) ,解决该题。

标签:sz,limits,P5642,路径,人造,解题,复杂度,lca,sum
From: https://www.cnblogs.com/ddl1no2home/p/17795472.html

相关文章

  • Codeforces Round#905 解题报告
    按理来说最近开始了一天一套div2计划,第一天做了一套Div1,第二天做了hustfc,第三天因为要赶latex期末考试,所以什么也没做。明天写一下hustfc比较牛的几题。A暴力怎么做,是不是加加加,然后判断。B本质上是让长度为\(i\)的后缀全是\(0\)那么找到最短的有\(i\)个\(0\)......
  • 「解题报告」Codeforces Round 653 (Div. 3)
    A.RequiredRemainderYouaregiventhreeintegers\(x,y\)and\(n\).Yourtaskistofindthemaximuminteger\(k\)suchthat\(0\lek\len\)that\(k\bmodx=y\),where\(\bmod\)ismodulooperation.Manyprogramminglanguagesusep......
  • Codeforces Round#905 解题报告
    由于是解题报告不是过题报告,所以理所当然的放弃了后三题代码的写。感觉这场Div1D是cyh的菜,E是gjk的菜。我负责菜。只写Div1题的题解。A双指针可以做\(m=1\)你发现随便换\(a_1\)答案最多减少\(1\),而且\(a_1\)越趋向于减少,所以可以二分分割点B最短路,怎么dij......
  • 「解题报告」Codeforces Round 905 (Div. 3)
    A.MorningYouaregivenafour-digitpincodeconsistingofdigitsfrom\(0\)to\(9\)thatneedstobeentered.Initially,thecursorpointstothedigit\(1\).Inonesecond,youcanperformexactlyoneofthefollowingtwoactions:Pressthecu......
  • 一道理解题意的题目
    这道题目的意思是是小数部分大于0.5直接进位,小于0.5直接舍弃,等于0.5看整数部分是奇数还是偶数(重点:舍弃直接看小数点后的第一位数字因为保留到整数,而不是从最后一位开始舍弃;有效数字的概念,如0.500就没有有效数字,0.501就有有效数字)然后这一道题还有非常骚的读入方法#include<bits......
  • 「解题报告」2023-10-17 模拟赛
    Prufer序列(prufer)题目描述:Pigbrain不知道什么时候学习了\(\texttt{prufer}\)序列。\(\texttt{prufer}\)序列可以用来表示一棵树,其构造方法是这样的:对于给定的树,假设节点编号为\(1\dotsn\),那么进行这样的操作:找到编号最小的度数为\(1\)的点。删除该节点,并在序......
  • 「解题报告」2023-10-17 模拟赛
    1、取石子游戏(nim.pas/c/cpp)【题目描述】小林和亮亮正在玩一个取石子的游戏。石子一共有\(n\)堆,其中第\(i\)堆恰好有\(i\)粒石子。小林先取,亮亮后取,并且两人依次轮流取石。每一次取石子的人可以选择任意一堆还未被取完的石子,并取走这一堆中任意多粒石子(注意,不能一粒石......
  • 「解题报告」[ABC267F] Exactly K Steps
    「解题报告」[ABC267F]ExactlyKSteps大家好,我是个毒瘤,我非常喜欢没脑子做法,于是我就用点分治过了这个题.离线在每个点存下与其相关的询问.考虑如何计算跨重心的答案.记录下每个点在当前重心下的深度,同时开一个桶\(t_{k,0/1}\)存下当前深度为\(k\)的,来自重心的不同......
  • 「解题报告」2023-10-14 模拟赛
    1.计数(count.cpp/c/pas)时间限制:1s内存限制:256MB【问题描述】给出\(m\)个数\(a_1,a_2,…,a_m\)求1~n中有多少数不是\(a_1,a_2,…,a_m\)的倍数。【输入】输入文件名为count.in。第一行,包含两个整数:\(n,m\)第二行,包含\(m\)个数,表示\(a_1,a_2,…,a_m\)【输出】......
  • NOI2024省选训练赛 11 解题报告
    NOI2024省选训练赛11解题报告目录NOI2024省选训练赛11解题报告A.小L的栈DescriptionConstraintsSolutionConclusionB.intervalDescriptionConstraintsSolutionConclusionC.DigitSumDescriptionConstraintsSolutionConclusionD.机器故障探测DescriptionConstraintsSoluti......