博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF1009F Dominant Indices - 题解
阅读量:4320 次
发布时间:2019-06-06

本文共 792 字,大约阅读时间需要 2 分钟。

题意:
求每棵子树中深度为k的子孙最多的k,有多个k取最小。
做法:
显然的DP是 $ f[i][j] $ 表示在i的子树内深度为j的点的个数,然而这样是 $ O(n^2) $ 的。
由于这道题与深度有关,所以考虑长链剖分。对于长链,直接继承孩子在长链上的答案。对于长链顶点,暴力向上DP转移,所以空间和时间复杂度都为所有长链的长度和,是 $ O(n) $ 的。

#include
#define pb push_back#define rep(i,a,b) for(int i=(a),i##ed=(b);i<=i##ed;i++)#define per(i,a,b) for(int i=(a),i##ed=(b);i>=i##ed;i--)using namespace std;const int N=1000010;int n; vector
e[N];int dep[N],son[N],ans[N];int f[N],dfn[N],idx,tp;int Max(int x,int y) { return x>y? x:y; }void dfs1(int u,int ff) { dep[u]=1; rep(i,0,e[u].size()-1) { int v=e[u][i]; if(v==ff) continue; dfs1(v,u),dep[u]=Max(dep[u],dep[v]+1); if(dep[son[u]]
f[dfn[u]+ans[u]]|| (j+1

转载于:https://www.cnblogs.com/daniel14311531/p/10458628.html

你可能感兴趣的文章
mac 无法打开xx ,因为无法确认开发者身份
查看>>
简单的排序算法(冒泡、选择、插入)
查看>>
[剑指Offer] 11.二进制中1的个数
查看>>
重置报表输出选择
查看>>
ip代理池抓取qq音乐热歌前300
查看>>
Android面试题集合
查看>>
Android NDK开发
查看>>
Centos中安装和配置vsftp简明教程
查看>>
spring源码学习之AOP(一)
查看>>
AES加密算法动画演示
查看>>
三种方法实现调用Restful接口
查看>>
php第五节(字符串函数和时间、日期函数)
查看>>
magento主页限制某个目录的产品显示数量
查看>>
SpringBoot整合Netty
查看>>
MongoDB数据库的基本操作
查看>>
PAT乙级1014
查看>>
ORACLE wm_concat自定义
查看>>
[Zend PHP5 Cerification] Lectures -- 6. Database and SQL
查看>>
[Drupal] Using the Administrator theme whenever you want.
查看>>
【Hibernate框架】关联映射(一对一关联映射)
查看>>