CodeForces 1111E. Tree
题目简述:给定$n \leq 10^5$个节点的无根树,以及$q \leq 10^5$个询问。每个询问给定$k \leq 10^5$个不同的节点$a_1, a_2, \dots, a_k$,以及参数$1 \leq r \leq n, 1 \leq m \leq \min\{k, 300\}$,求将这$k$个节点分成不超过$m$组(本质不同)的方案数,使得
·每组节点至少有一个;
·以$r$为根时,任意节点的祖先不与该节点同组。
解:code
对每组询问,令$h[a_i]$表示$a_1, a_2, \dots, a_k$中$a_i$的祖先(不含自身)的个数。按$h[a_i]$从小到大排序$a_i$后,令$F[i][j]$表示前$i$个节点分成$j$组(本质不同)的合法方案数,则
$$ F[i][j] = (j-h[a_i])F[i-1][j]+F[i-1][j-1], $$
特别地,$F[0][j] = [j = 0]$。动态规划的复杂度为$O(mk)$。
现在的问题是,如何求得$h[a_i]$。若令$h_1[a_i]$表示以节点$1$为根时,$a_1, a_2, \dots, a_k$中$a_i$的祖先(含自身)的个数,则
$$ h[a_i] = h_1[a_i]+h_1[r]-2h_1[\text{LCA}(a_i, r)]+[\text{LCA}(a_i, r) \in \{a_1, a_2, \dots, a_k\}]-1, $$
其中$\text{LCA}(u, v)$表示$u$和$v$的最近公共祖先。
而$h_1[]$易于计算的,我们可以求树以节点$1$为根的DFS序,则$h_1[]$的维护可化为“区间修改”和“单点询问”的线段树问题。
求LCA的时间复杂度为$O(n\log n)$预处理以及$O(\log n)$单次询问。(其实可以将LCA转化为$\pm 1$RMQ问题,做到$O(n)$预处理以及$O(1)$单次询问。但这并不是重点。)
从而总的时间复杂度为$O(n\log n + K (m+\log n))$,其中$K$为所有询问的$k$之和。
解2:
计算$h[a_i]$可以看做是$a_i$至$r$的树链上的求和,可以用树链剖分在$O(k \log^2 n)$的时间复杂度内直接求得,而不需要经过任何问题的转化。
CodeForces 1111E. Tree的更多相关文章
- Tree CodeForces - 1111E (树,计数,换根)
大意: 给定树, 多组询问, 每个询问给出一个点集$S$, 给定$m, r$, 求根为$r$时, $S$的划分数, 满足 每个划分大小不超过$m$ 每个划分内不存在一个点是另一个点的祖先 设点$x$的 ...
- Codeforces 675D Tree Construction Splay伸展树
链接:https://codeforces.com/problemset/problem/675/D 题意: 给一个二叉搜索树,一开始为空,不断插入数字,每次插入之后,询问他的父亲节点的权值 题解: ...
- Codeforces 570D TREE REQUESTS dfs序+树状数组 异或
http://codeforces.com/problemset/problem/570/D Tree Requests time limit per test 2 seconds memory li ...
- Codeforces 570D - Tree Requests【树形转线性,前缀和】
http://codeforces.com/contest/570/problem/D 给一棵有根树(50w个点)(指定根是1号节点),每个点上有一个小写字母,然后有最多50w个询问,每个询问给出x和 ...
- Codeforces 23E Tree
http://codeforces.com/problemset/problem/23/E 题意:给一个树,求砍断某些边,使得所有联通块大小的乘积最大.思路:f[i][j]代表当前把j个贡献给i的父亲 ...
- Codeforces 1092F Tree with Maximum Cost(树形DP)
题目链接:Tree with Maximum Cost 题意:给定一棵树,树上每个顶点都有属性值ai,树的边权为1,求$\sum\limits_{i = 1}^{n} dist(i, v) \cdot ...
- [Educational Round 17][Codeforces 762F. Tree nesting]
题目连接:678F - Lena and Queries 题目大意:给出两个树\(S,T\),问\(S\)中有多少连通子图与\(T\)同构.\(|S|\leq 1000,|T|\leq 12\) 题解 ...
- Codeforces 911F Tree Destruction
Tree Destruction 先把直径扣出来, 然后每个点都和直径的其中一端组合, 这样可以保证是最优的. #include<bits/stdc++.h> #define LL lon ...
- CodeForces 570D - Tree Requests - [DFS序+二分]
题目链接:https://codeforces.com/problemset/problem/570/D 题解: 这种题,基本上容易想到DFS序. 然后,我们如果再把所有节点分层存下来,那么显然可以根 ...
随机推荐
- 安装protobuf可能遇到的问题
下载protobuf-2.3.0: http://protobuf.googlecode.com/files/protobuf-2.3.0.zip http://code.google.com/ ...
- windows命令大全(转载)
winver---------检查Windows版本 wmimgmt.msc打开Windows管理体系结构(wmi) wupdmgrWindows更新程序 w脚本Windows脚本宿主设置 write ...
- java nio 通道(二)
本文章来源于我的个人博客: java nio 通道(二) 一,文件通道 文件通道总是堵塞式的,因此不能被置于非堵塞模式. FileChannel对象是线程安全的.多个进程能够在同一个实例上并发调用方法 ...
- php 批量删除数据
php 批量删除数据 :比如我们在看邮箱文件的时候,积攒了一段时间以后,看到有些文件没有用了 这时候我们就会想到把这些 没用的文件删除,这时候就用到了批量删除数据的功能,这里我是用了数据库原有的一个表 ...
- EasyDarwin开源流媒体云平台之EasyRMS录播服务器功能设计
需求背景 EasyDarwin开发团队维护EasyDarwin开源流媒体服务器也已经很多年了,之前也陆陆续续尝试过很多种服务端录像的方案,有:在EasyDarwin中直接解析收到的RTP包,重新组包录 ...
- EasyPlayer iOS开源流媒体播放器中AAC解码PCM问题
本文转自EasyDarwin开源团队成员Penggy的博客:http://www.jianshu.com/p/feeb107b6657 最近遇到在 iOS 平台上实时播放 AAC 音频数据流, 一开始 ...
- javascript 获取当前日期 月份 时间
<script type="text/javascript"> function getDate() { var date = new Date(); //得到当前日期 ...
- 九度OJ 1084:整数拆分 (递归)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2274 解决:914 题目描述: 一个整数总可以拆分为2的幂的和,例如: 7=1+2+4 7=1+2+2+2 7=1+1+1+4 7=1+1 ...
- A桶中有多少水?
如果你能算出桶中有多少水,我便许你下山去玩.有一天,老和尚让小和尚将A桶的水挑到B桶去,可是小和尚却想下山玩,不愿意挑水,老和尚便说:”如果你能够根据我的提示算出A桶中有多少升水,我便许你下山去玩.” ...
- 基于springboot的Dubbo的常规总结
1.引入jar包: <!-- Spring Boot Dubbo 依赖 --> <dependency> <groupId>com.alibaba.spring.b ...