首页 > 其他分享 >【十二省联考2019】希望(容斥,换根DP,长链剖分,懒标记)

【十二省联考2019】希望(容斥,换根DP,长链剖分,懒标记)

时间:2022-10-31 08:34:01浏览次数:51  
标签:长链 剖分 fa tag 全局 prod 联考 DP neq

暴力的想法是考虑钦定每个点作为到达点并统计贡献,但显然这样会算重。

注意到会算重的到达点一定构成了一个连通块,这是一个很好的性质,方便了我们容斥:我们直接用点的贡献减去边的贡献(一条边的两个端点同时是到达点)即可,因为一个连通块满足点数减边数等于 \(1\)。

先考虑点的贡献,需要统计以某个点为根且深度不超过 \(L\) 的连通块个数。

可以换根 DP:设 \(f_{u,i}\) 表示 \(u\) 子树内以 \(u\) 为根且深度不超过 \(i\) 的连通块个数,\(g_{u,i}\) 表示 \(u\) 子树外以 \(u\) 为根且深度不超过 \(i\) 的连通块个数,转移:(其中 \(s_u\) 表示 \(u\) 的儿子集合)

\[\begin{aligned} f_{u,i}&=\prod_{v\in s_u} (f_{v,i-1}+1)\\ g_{u,i}&=g_{fa,i-1}\prod_{v\in s_{fa},v\neq u}(f_{v,i-2}+1)+1 \end{aligned} \]

注意 \(\prod\limits_{v\in s_{fa},v\neq u}(f_{v,i-2}+1)\) 不能写成 \(\dfrac{f_{fa,i-1}}{f_{u,i-2}+1}\),因为在模意义下有可能 \(f_{u,i-2}+1\) 为 \(0\)。

单点贡献即为 \((f_{u,L}\cdot g_{u,L})^k\)。同时单边 \((fa,u)\) 的贡献也得到了,即为 \((f_{u,L-1}\cdot g_{u,L})^k\)。

然而暴力 DP 的复杂度为 \(O(nL)\) 的,需要优化。

先来处理 \(f\),看到 \(f\) 的定义和深度有关,考虑用长链剖分优化:记 \(son_u\) 为 \(u\) 的重儿子,让 \(f_{u}\) 继承 \(f_{son_u}\) 的信息,再从 \(u\) 的其他儿子 \(v\) 转移过来。这里下标偏移一位的问题可以用指针处理,然后全局+1可以用 add 标记处理。

但注意到 \(f_{v}\) 的数组大小范围并不是 \(d_v\)(设 \(d_v\) 表示 \(v\) 子树内深度最大值),而是 \(0\sim L\) 都有值(根据 \(f\) 的定义)。

但 \(f_v\) 也是有特征的:\(f_{v,d_v}=f_{v,d_v+1}=\cdots =f_{v,L}\)。于是用 \(f_v\) 向 \(f_u\) 转移时,实际上做的是前 \(d_v+1\) 位暴力转移,后面的位做的是同乘 \(f_{v,d_v}+1\)。

这可以用线段树维护,但是有一个更加美妙的做法:

  • 若 \(f_{v,d_v}+1=0\),则 \(f_u\) 第 \(d_v+1\) 位之后将一直会是 \(0\),这可以打个 tag。
  • 若 \(f_{v,d_v}+1\neq 0\),我们打一个 \(f_u\) 全局乘 \(f_{v,d_v}+1\) 的 tag,然后前 \(d_v+1\) 位暴力转移时再乘上 \(f_{v,d_v}+1\) 的逆。

然后就会出现很多 tag 要维护……

具体来说有以下五种:全局乘 \(mul\),\(mul\) 的逆元 \(imul\),全局加 \(add\)(优先级在全局乘后),重置位置 \(lim\)(\(lim\) 以后的位置都被重置),重置值 \(reset\)(受全局乘和全局加影响)。

此时 \(f\) 就大致维护好了,时间复杂度 \(O(n)\)。

接下来是如何维护 \(g\)。

发现我们只需要维护 \(g_{u,L-d_u}\sim g_{u,L}\) 的值,因为求 \(g_{u,L}\) 只需要用到 \(g_{fa,L-1}\) 的值。

那么同样考虑用长链剖分优化:让 \(g_{son_u}\) 继承 \(g_u\) 的信息,而其他儿子由 \(g_u\) 暴力转移。

现在问题是对每一个儿子 \(v\) 求出 \(\prod\limits_{v'\in s_{u},v'\neq v}(f_{v',i-2}+1)\)。

显然是需要前缀和后缀拼起来的,我们这么考虑:我们让求 \(f\) 的时候按 \(d\) 从大到小枚举儿子(这样第一个枚举的一定是重儿子),并记录 \(f\) 的变化,然后求 \(g\) 的时候按 \(d\) 从小到大枚举儿子,前缀显然可以边枚举边求出,而后缀则可以通过不断还原 \(f\) 求出。

\(g\) 也可以用 5 个 tag 维护。

有关求逆:我们需要每次 \(O(1)\) 计算出 \(f_{u,d_u}\) 的逆,注意到此时第二维是没有影响的,所以可以先求出所有的 \(f_{u,d_u}\) 再离线 \(O(n)\) 预处理它们的逆元(每个值的逆=全部乘起来的逆×前缀积×后缀积)。

代码没写完。

标签:长链,剖分,fa,tag,全局,prod,联考,DP,neq
From: https://www.cnblogs.com/ez-lcw/p/16843018.html

相关文章

  • 【XSY3726】大猫熊和他的k边形(三角剖分,卡特兰数)
    记录一下两个结论。有标号\(n\)边形的三角剖分数等于\(B_{n-2}\),其中\(B\)是卡特兰数。证明:考虑DP,设\(C_n\)为有标号\(n\)边形的三角剖分数,考虑与\(1\)号......
  • 【XSY3679】农民(树链剖分)
    题面题解先考虑一个节点怎么样才会被走到。对于一个权值为为\(x\)的节点,它的左子树内的节点有可能被走到仅当其权值小于\(x\),右子树内的节点有可能被走到仅当其......
  • 【XSY3633】匹配(树形 DP,树链剖分,分治)
    考虑最普通的DP:设\(f_{u,i,0/1}\)表示\(u\)子树内恰好包含\(i\)条边的最大权匹配,其中\(u\)有无被匹配。这是个树上背包,暴力DP是\(O(n^2)\)的。可以发现\(f......
  • 【WC2010】重建计划(分数规划+长链剖分)
    长链剖分因为有很多巨佬只是讲了一下大致的做法,并没有详细地解释如何维护,所以就有了这篇题解。巨佬们都不屑于详细写,我太弱了/kk首先先对原树进行长链剖分。先讲一些定......
  • 【bzoj4869】【六省联考2017】相逢是问候(扩展欧拉函数)
    和《花神游历各国》有异曲同工之妙。首先能想到扩展欧拉定理:\[a^b\equiv\begin{cases}a^{b\bmod\varphi(p)+\varphi(p)}&\text{if}b\geq\varphi(p)\\a^b&\text{if}......
  • 【bzoj2402】陶陶的难题II(分数规划+树链剖分+斜率优化+半平面交)
    题目让我们维护这么一个东西:\(\dfrac{y_i+q_j}{x_i+p_j}\)的最大值。容易想到分数规划,二分枚举答案\(mid\),则有:\(\dfrac{y_i+q_j}{x_i+p_j}=mid\)化简:\(y_i+q_j=mid\t......
  • 树链剖分
    剖分过程voiddfs1(intu){ son[u]=-1; siz[u]=1; for(inti=hd[u];i;i=g[i].nxt) { intv=g[i].to; if(!dep[v]) { dep[v]=dep[u]+1; ......
  • LG7521 [省选联考 2021 B 卷] 取模
    LG7521[省选联考2021B卷]取模给定\(n\)个正整数\(a_i\),请你再其中选出三个数\(i,j,k(i\neqj,i\neqk,i\neqk)\),使得\((a_i+a_j)\bmoda_k\)的值最大。复......
  • 【图论】长链剖分学习笔记
    参考文章1参考文章20x01:引入与重链剖分不同,长链剖分以子树深度最大的儿子作为重儿子,这里所述之深度是指子树内离它最远的叶子到它的距离。如图绿色部分就是长链。......
  • 【转载】毛毛虫剖分
    转载声明转载自关于毛毛虫剖分-一粒夸克定义一种由重链剖分推广而成的树上结点重标号方法,支持修改/查询一只毛毛虫的信息,并且可以对毛毛虫的身体和足分别修改/查询......