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序. 然后,我们如果再把所有节点分层存下来,那么显然可以根 ...
随机推荐
- 如何把网页或html内容生成图片
网页或html内容生成图片 今天想把做好的html内容或网页生成一张图片,没有网页在线版的生成或转换工具,除非下载客户端软件使用. 不过,发现可以利用搜狗高速浏览器和360浏览器生成图片,这里讲解 ...
- HDU 5667 :Sequence
Sequence Accepts: 59 Submissions: 650 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536 ...
- create a backdoor deb package
以下介绍怎样制作包括后门的deb安装包.以tree为例进行说明.利用apt-get下载安装包.--download-only表示仅仅下载不做其它处理. root@deb:~#apt-get downl ...
- [转]eclipse查看某个java类属于哪个jar包
原文地址:https://blog.csdn.net/csdnliuxin123524/article/details/73572836 在eclipse界面直接按ctrl+shift+t,弹出以下界 ...
- git操作-如何把你的本地仓库放到GitHub已有仓库
本地: 首先在你的本地git init 初始化一个仓库,然后git add . 将所有的文件都打包到仓库中,git -commit -m "first_commit" 此时是没有什 ...
- KMP算法模式匹配
转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/37832707 作者:小马 在一个长串中查找一个子串是较经常使用的操作.各种信息检索 ...
- EasyDarwin流媒体服务器实现关键帧推送功能
-本篇由团队成员Fantasy供稿! 功能背景 随着社会进步,人们对产品体验要求越来越高.EasyDarwin也不例外.为了能满足用户对链接服 后看到画面时间(也就是我们经常看到的起播时间)短的要求, ...
- Redis(二)延迟队列
1.目录 延迟队列 进一步优化 2.延迟队列 package com.redis; import java.lang.reflect.Type; import java.util.Set; impor ...
- 传递一个父id返回所有子id的用法,可用于删除父级以下的所有子级
先在common文件夹建立一个function.php文件,然后写一个递归函数,传递一个父id返回所有子id,如下: function getChildrenId($node,$pid){ $arr= ...
- db的操作
'/---------------------------------------------------------------------------------------------- '/ ...