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分 方 ...
随机推荐
- springmvc 项目完整示例04 整合mybatis mybatis所需要的jar包 mybatis配置文件 sql语句 mybatis应用
百度百科: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBat ...
- 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(6)- 打包发布(PyInstaller3.3.1)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之打包发布. 经过上一篇软件优化之后,Jays-PyCOM已经初长成,该到了出去历练的时候了,只有经 ...
- Promise杂记
更好的阅度体验 前言 API Promise特点 状态跟随 V8中的async await和Promise 实现一个Promise 参考 前言 作为一个前端开发,使用了Promise一年多了,一直以来 ...
- 使用Linq查找重复
namespace RemoveTheSame { class Program { static void Main(string[] args) { List<User> list = ...
- Java开发笔记(九)赋值运算符及其演化
前面的加减乘除四则运算,计算结果通过等号输出给指定变量,注意此时代码把变量放到等号左边.而在算术课本里,加法运算的完整写法类似于“1+1=2”这样,运算结果应该跟在等号右边.不过代数课本里的方程式存在 ...
- 【eclipse】eclipse报错:the resource is not on the build path of a java project
最近在eclipse中,使用svn导入svn上的一个maven项目,但是导入后类的包并没有以源码包的方式显示,而是以普通文件包的方式显示出来,在对类进行F3等操作时就报错:“the resource ...
- Linux设置Swap虚拟内存方法
linux可以文件或者分区来当作虚拟内存. 首先查看当前的内存和swap 空间大小(默认单位为k, -m 单位为M): free -m 查看swap信息,包括文件和分区的详细信息 swapon -s或 ...
- Fundebug后端Java异常监控插件更新至0.3.1,修复Maven下载失败的问题
摘要: 0.3.1修复Maven下载失败的问题. 监控Java应用 1. pom.xml 配置fundebug-java依赖 <dependency> <groupId>com ...
- 2-SAT速成
本文只做总结性说明 2-SAT 2-SAT是k-SAT问题的一种,k-SAT问题在\(k>=3\)时已经被证明是NP完全问题 2-SAT问题定义比较简单 有n个布尔变量\(x_1-x_n\).给 ...
- Apex 中操作用户和组
用户和组概述 Salesforce中对于用户的定义主要体现于两个对象:用户(User)和组(Group).组的成员可以是用户也可以是另一个组. Salesforce中的组可以有多种表示方法,比如队列( ...