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分 方 ...
随机推荐
- angr进阶(6)绕过反调试
angr绕过反调试,一个是通过之前的方式,使用从特定位置开始测试的方法,还有一种通过hook进行反调试的方法. 其原理就在于angr能够符号化表示函数tumctf2016_zwiebe p.hook_ ...
- Docker快速搭建LNMP环境
一.使用Dockerfile制作镜像 前面的博客中已经介绍了如何基于容器制作镜像,此方法的原理是使用一个正在运行的容器,根据生产所需进行配置更改等操作后,使其满足生产环境,再将这个容器打包制作为镜像, ...
- 使用asp.net mvc + entityframework + sqlServer 搭建一个简单的code first项目
步骤: 1. 创建一个asp.net mvc 项目 1.1 项目创建好结构如下 2 通过vs安装EntityFramework框架 install-package entityframework 3. ...
- import提升导致Fundebug报错:“请配置apikey”
摘要: 解释一下"请配置apikey"报错的原因. 部分Fundebug用户使用import来导入js文件时,出现了"请配置apikey"的报错,这是由于imp ...
- Array的 map() 和 reduce()
map() map() 方法返回一个新数组,新数组中的元素为原始数组中的元素依次调用参数中的函数处理后的值. map() 方法不会对空数组进行检测,也不会修改原数组. 语法: array.map(fu ...
- vue+vuecli+webapck2实现多页面应用
准备工作 在本地用vue-cli新建一个项目,首先安装vue-cil,命令: npm install -g vue-cli 新建一个vue项目,创建一个基于"webpack"的项目 ...
- CSS-蜂窝状展示区域(多个六边形)的一种实现方式
网上已经有很多关于正六边形的CSS画法,主要是利用一个矩形和前后的两个三角形组合而成. 之前在看四维图新的官网的时候,发现了一种六边形的画法,比较适合多排六边形组合成蜂窝状的展示区域(注:四维图新现在 ...
- 优秀代码摘录片段一:LinkedList中定位index时使用折半思想
在LinkedList有一段小代码,实现的功能是,在链表中间进行插如,所以在插如的过程中会需要找到对应的index位置的node元素: 如果放在平时只为了实现功能而进行遍历查找,很多人会直接使用一个w ...
- QT日志系统
今天给大家介绍下QT里面的日志系统,直接上代码 #include <QApplication> #include <iostream> #include "ThorH ...
- 【已解决】checkout 配置无效的问题可以进来看下
在日常工作中,我们经常会遇到要更新一个项目,但是由于更改了配置,需要将这些配置commit或者checkout,但是有的同学不想commit怎么办呢,只能通过checkout,那么问题又来了,改了很多 ...