LOJ3053 十二省联考2019 希望 容斥、树形DP、长链剖分

官方题解其实讲的挺清楚了,就是锅有点多……
一些有启发性的部分分
L=N
一个经典(反正我是不会)的容斥:最后的答案=对于每个点能够以它作为集合点的方案数-对于每条边能够以其两个端点作为集合点的方案数。原因是:对于每一种合法方案,集合点一定是树上的一个连通块,满足\(n=m+1\)。算点时,这种方案被算了\(n\)次;算边时,这种方案被算了\(m=n-1\)次,所以每一个方案都恰好被算了一次。
有\(DP\):设\(f_i-1\)表示选择了包含\(i\)和\(i\)的子树中的点的一个连通块的方案数,转移枚举每一个儿子选不选。然后设\(g_i\)表示以\(i\)为原树的根,选择了包含\(i\)和\(i\)的子树中的点的一个连通块的方案数,这个在求完\(f\)之后换根DP,换根的时候可以同时计算出每条边的方案。
NL较小
改一下\(N=L\)的DP:设\(f_{i,j}-1\)表示选择了包含\(i\)和\(i\)的子树中的点的一个连通块,其中距离\(i\)点最远的点与\(i\)距离\(\leq j\)的方案数,\(g_{i,j}\)表示以\(i\)为原树的根,选择了包含\(i\)和\(i\)的子树中的点的一个连通块,其中距离\(i\)点最远的点与\(i\)距离为\(\leq j\)的方案数。
同样可以求完\(f\)后换根DP求\(g\),但是有个问题:如何从\(f_{fa_x}\)中去掉\(f_x\)的贡献。可以在计算\(f\)的时候计算每一个点合并所有孩子的一个前缀的答案、合并所有孩子的一个后缀的答案,这样把一个前缀和一个后缀拼起来就可以得到去掉\(f_x\)的贡献的\(f_{fa_x}\)。
链
枚举一下点和边,方案数可以直接算
k=1
可以枚举选择的连通块的根,用长链剖分+线段树优化,与正解关系不大所以略过
正解
从\(NL \leq 10^7\)开始。稍微修改一下\(g_{i,j}\)的定义:设\(g_{i,j}\)表示选择\(i\)、不选择\(i\)的子树,选择的连通块中最大距离\(\leq j\)的方案数。
f的优化
注意到\(f\)可以长链剖分优化。在长链剖分的转移中我们需要支持后缀乘(因为后缀有一段要乘的值相同)、整体加(转移完成之后所有\(f_{i,j}\)需要\(+1\)),可以给长链剖分打乘法标记\(a\)和加法标记\(b\)解决,一次后缀乘就把前面没有乘的部分乘上逆元。可能会有乘\(0\)的问题,所以还需要一个后缀赋值标记,当乘\(0\)时把当前的后缀赋值为\(-\frac{b}{a}\)。
g的优化
\(g\)是一个换根DP,但是也可以用长链剖分优化。将重链和轻边的转移分开考虑:①对于重链直接暴力将轻儿子的\(f\)值转移过来,复杂度跟长链剖分一样;②对于轻边,假设这条轻边转移到的点\(x\)的子树深度为\(p\),那么因为在最后统计答案的时候只需要每个点的\(g_{x,L}\),所以\(x\)子树中只有\(g_{x,j}(j \in [L - p , L])\)有用,可以只转移这一些值。那么每一条轻边就只会转移轻子树深度个\(g\),总复杂度也是均摊\(O(n)\)的
g的转移时的一个问题
我们还需要解决在转移\(g\)的过程中要取孩子的一个前缀和一个后缀的问题。可以主席树但是\(O(nlogn)\)有点慢。考虑按照求\(f\)时DFS顺序的反序DFS求\(g\),我们到达一个点、即将递归到下一个点的时候,将这个点对于当前点的\(f\)的贡献消除,这样可以得到前缀的值,再拿另一个数组维护一下后缀的\(f\)值就可以得到前缀和后缀。支持撤销只需要在每一次从轻边修改一个点时把所有标记和将要修改的位置的值记录下来打包丢到一个栈里面。
线性求逆元
有一个预处理逆元的科技:可知要求逆元的数一定是\(f_{x , p}\),其中\(p\)是\(x\)的子树大小,所以用\(L=N\)部分分的方法将所有\(dp_{x,p}\)预处理出来,然后用类似于预处理阶乘逆元的方式预处理逆元,在更新乘法标记\(a\)的同时同步更新\(a^{-1}\),就可以做到严格的\(O(n)\)求解。
细节非常非常的多……写题两小时调试一整天
LOJ3053 十二省联考2019 希望 容斥、树形DP、长链剖分的更多相关文章
- luogu P5291 [十二省联考2019]希望
luogu loj 无论最终结果将人类历史导向何处 \(\quad\)我们选择 \(\quad\quad\)\(\large{希望}\) 诶我跟你讲,这题超修咸的 下面称离连通块内每个点距离不超过\( ...
- 洛谷 5291 [十二省联考2019]希望(52分)——思路+树形DP
题目:https://www.luogu.org/problemnew/show/P5291 考场上写了 16 分的.不过只得了 4 分. 对于一个救援范围,其中合法的点集也是一个连通块. 2n 枚举 ...
- 【题解】Luogu P5291 [十二省联考2019]希望
ytq鸽鸽出的题真是毒瘤 原题传送门 题目大意: 有一棵有\(n\)个点的树,求有多少方案选\(k\)个联通块使得存在一个中心点\(p\),所有\(k\)个联通块中所有点到\(p\)的距离都\(\le ...
- [十二省联考2019]字符串问题——后缀自动机+parent树优化建图+拓扑序DP+倍增
题目链接: [十二省联考2019]字符串问题 首先考虑最暴力的做法就是对于每个$B$串存一下它是哪些$A$串的前缀,然后按每组支配关系连边,做一遍拓扑序DP即可. 但即使忽略判断前缀的时间,光是连边的 ...
- [十二省联考2019]异或粽子——可持久化trie树+堆
题目链接: [十二省联考2019]异或粽子 求前$k$大异或区间,可以发现$k$比较小,我们考虑找出每个区间. 为了快速得到一个区间的异或和,将原序列做前缀异或和. 对于每个点作为右端点时,我们维护出 ...
- 【BZOJ5495】[十二省联考2019]异或粽子(主席树,贪心)
[BZOJ5495][十二省联考2019]异或粽子(主席树,贪心) 题面 BZOJ 洛谷 题解 这不是送分题吗... 转异或前缀和,构建可持久化\(Trie\). 然后拿一个堆维护每次的最大值,每次如 ...
- 【BZOJ5496】[十二省联考2019]字符串问题(后缀树)
[BZOJ5496][十二省联考2019]字符串问题(后缀树) 题面 BZOJ 洛谷 题解 首先显然可以把具有支配关系的串从\(A\)到\(B\)连一条有向边,如果\(B_i\)是\(A_j\)的前缀 ...
- 【BZOJ5498】[十二省联考2019]皮配(动态规划)
[BZOJ5498][十二省联考2019]皮配(动态规划) 题面 BZOJ 洛谷 题解 先考虑暴力\(dp\),设\(f[i][j][k]\)表示前\(i\)所学校,有\(j\)人在某个阵营,有\(k ...
- P5290 [十二省联考2019]春节十二响
题目地址:P5290 [十二省联考2019]春节十二响 骗分方法 如果你实在一点思路也没有,暴力都不会打,那么请考虑一下骗分. 方法一 输出所有 \(M\) 的和. 期望得分:0分. 实际还有5分 方 ...
随机推荐
- 在数据采集器中用TensorFlow进行实时机器学习
最新DataOps平台的真正价值,只有在业务用户和应用程序能够从各种数据源来访问原始数据和聚合数据,并且及时地产生数据驱动的认识时,才能够实现.利用机器学习(Machine Learning),分析师 ...
- 原型模式 prototype 创建型 设计模式(七)
原型模式 prototype 意图 用原型实例指定需要创建的对象的类型,然后使用复制这个原型对象的方法创建出更多同类型的对象 显然,原型模式就是给出一个对象,然后克隆一个或者更多个对象 小时候看 ...
- 改善 C# 的语言习惯(一) - 使用属性而不是可访问的数据成员(整理中)
改善 C# 的语言习惯(一) - 使用属性而不是可访问的数据成员 序 为什么我们的程序运行得棒棒的,还要改呢?Why? 答:我们要让程序运行得更快,执行的效率更高,代码的可读性更强,维护的成本更低.. ...
- Android破解学习之路(十三)—— 另类的破解VIP思路
前言 一般按照以往,我们想要获得某个软件的VIP,一般是通过修改支付宝的支付流程,原本购买失败的,我们修改代码,从而使得失败变成了成功,不花费金钱 另类思路 有些软件将判断用户是否为VIP的代码写在了 ...
- Maven(十一)导入手动创建的Maven 工程
传统的导入方式并不能导入手动创建的Maven工程 因为eclipse项目必须有如图所示文件,才被认为是Eclipse工程 使用Maven方式导入 导入选项中并没有把项目复制到工作空间的选项,这是与传统 ...
- Java实践:一个简易的http server和client的java源码学习和总结。
一.基本思路: 1.服务器端通过socket(), 监听在TCP 8080端口,等待客户端来连接. 2.服务器端解析客户端的HTTP请求中的URI值,把本地的目录下指定文件通过java的读取文件的方式 ...
- PHP实现开心消消乐的算法示例
本文主要介绍了关于PHP如何实现我们大家都知道的开心消消乐的算法,分享PHP教程出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一.需求描述: 1.在一个8*8的矩阵方格中随机 ...
- Mysql学习路线
本文内容: mysql学习路线 首发日期:2018-04-19 由于现在很多都是有api了,很多问题都转接到编程语言上来处理了,所以这篇mysql之路仅仅是作为“了解”之用.不深究mysql. 很多东 ...
- git上传新项目到coding
1:coding.net注册账号,并创建项目.可以将readme.txt打上勾 2:cd到本机的项目文件夹下 在git中代表workspace 3:mac用户用ls -all ,linux用户用ll ...
- Task.Wait and “Inlining”
“What does Task.Wait do?” Simple question, right? At a high-level, yes, the method achieves what its ...