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序. 然后,我们如果再把所有节点分层存下来,那么显然可以根 ...
随机推荐
- 浅谈MySQL外键
http://www.xiaoxiaozi.com/2009/07/12/1158/ 像MySQL这样的关系型数据库管理系统,它们的基础是在数据库的表之间创建关系的能力.通过方便地在不同表中建立记录到 ...
- sass的使用(载)
一.什么是SASSSASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护.本文总结了SASS的主要用法.我的目标是,有了这篇文章,日常的一般使 ...
- TIP2
mktemp :建立暂存/临时文件 more to see 'man mktemp' 语 法 mktemp[选择参数] 功 能 mktemp 命令:用于建立暂存文件,提供给shell脚本安全的使用临时 ...
- caffe学习--cifar10学习-ubuntu16.04-gtx650tiboost--1g--02
caffe学习--cifar10学习-ubuntu16.04-gtx650tiboost--1g--02 训练网络: caffe train -solver examples/cifar10/cifa ...
- ACM-BFS之Open the Lock——hdu1195(双向BFS)
这道题的0基础版本号,暴力BFS及题目详情请戳:http://blog.csdn.net/lttree/article/details/24658031 上回书说道,要用双向BFS来尝试一下. 最终A ...
- 【Web探索之旅】第三部分第一课:server
wx_fmt=jpeg" alt="0? wx_fmt=jpeg" style="height:auto"> 内容简单介绍 .第三部分第一课:s ...
- 在VC++空工程中使用MFC类,采用Unicode字符集后,运行工程程序报错的解决方案
创建一个VC++空工程,将Project Properties->General->Use of MFC改为Use MFC in a Shared DLL 新建一个源文件,内容如下 #in ...
- 20170306 处理adobe flash player报错
网页总是弹出Adobe Flash Player弹窗报错怎么办?打开网页时经常被Adobe Flash Player报错提示框困扰. 其实是因为系统安装了Debug版本的Flash Player,可是 ...
- 设置VIM查找时不区分大小写
:set ic 永久生效 vi ~/.vimrc set ic
- 在iOS平台使用ffmpeg解码h264视频流(转)
在iOS平台使用ffmpeg解码h264视频流,有需要的朋友可以参考下. 对于视频文件和rtsp之类的主流视频传输协议,ffmpeg提供avformat_open_input接口,直接将文件路径或UR ...