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分 方 ...
随机推荐
- 微服务浪潮中,程序猿如何让自己 Be Cloud Native
前言 CNCF 与 Cloud Native 这两个技术词汇最近频频走进了程序员的视野,一切和他能搭上边的软件意味着标准.开放.时尚,也更能俘获技术哥哥们的心:这篇文章不想去带大家重温这个词汇后面的软 ...
- 如何设计一个 RPC 系统
本文由云+社区发表 RPC是一种方便的网络通信编程模型,由于和编程语言的高度结合,大大减少了处理网络数据的复杂度,让代码可读性也有可观的提高.但是RPC本身的构成却比较复杂,由于受到编程语言.网络模型 ...
- Docker系列09—Docker的系统资源限制及验证
本文收录在容器技术学习系列文章总目录 1.限制容器的资源 默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的尽可能多的给定资源.Docker提供了控制容器可以使用多少内存或CPU的方法,设置 ...
- 解读经典《C#高级编程》第七版 Page100-107.继承.Chapter4
前言 本章节继续讲实现继承. 实现继承 密封类和密封方法 密封类和方法的概念很简单,就是为了不允许类和方法被继承和扩展.不允许扩展一般的原因有: 如果类或者方法被扩展,可能会导致类库执行错误 因为版权 ...
- ROS笔记2 构建一个package
构建package catkin_make 可以理解为一个集成了CMake和make的命令行工具 通常的cmake构建如下 # In a CMake project $ mkdir build $ c ...
- python3中time模块与datetime模块的简单用法
__author__ = "JentZhang" import time # Timestamp 时间戳 print("Timestamp 时间戳:") pri ...
- 在android studio中配置运行时签名
做项目的时候,有时需要用到第三方接口,而基本第三方接口都是要求我们要先进行签名.结果每次调试都得手动进行签名一次,实在麻烦.所以android studio提供了一种在运行的时候自动进行签名的方法,在 ...
- 小程序实践(十一):showModal的使用
显示模态对话框,确定和取消两个选择+标题+内容的对话框 . // 编辑用户性别 tapSex:function(res){ var that = this wx.showModal({ title: ...
- No module named "Crypto",如何安装Python三方模块Crypto
前两天公司公司老总让我研究怎么用企业微信第三方应用进行官网对接,完成URL回调验证问题. 具体如何进行Python 的Django网站与企业微信第三方应用进行回调验证的博客地址为:https://ww ...
- windows/Linux下的程序员文档浏览工具
Dash + Alfred https://www.jianshu.com/p/77d2bf8df81f 对于程序员来说,查看api文档是非常频繁,经常窗口之间切换非常麻烦,mac下就有一个查文档的神 ...