[BalticOI 2017] Cat in a tree

神仙美少女 Tweetuzki 学姐用了长剖+线段树,私以为长剖可以做到线性。

简要题意
  • 给定 \(n\) 个点的树,点集 \(S\) 合法当且仅当 \(\forall u,v\in S, dis(u,v)\ge k\)。求 \(\max |S|\)。

  • \(n \le 2\times 10^5\)。

题解

记 \(f_{u,i}\) 表示以 \(u\) 为根的子树中,选择的深度最浅的点深度大于等于 \(i\) 的最大点集大小。此处深度针对这一子树而言。转移考虑加入一棵子树,方程比较简单:更新 \(f_{u,j}\) 时,记 \(t = \max(j,k-j)\)(分别保证状态的合法性和答案的合法性),\(f_{u,j}\leftarrow \max(f_{u,j}+f_{v,t-1}, f_{u,t}+f_{v,j-1})\),最后做一遍后缀 \(\max\) 即可。

注意到当 \(j \gt dep_u\) 时,\(f_{u,j}=0\)。所以转移时只需要枚举到 \(dep_v\) 即可。这启发我们使用长剖优化。

代码

注意边界细节。

#include <cstdio>
#include <algorithm>
#include <cstring> using namespace std; const int MAXN = 200010; int n, K;
struct edge{
int ne, to;
edge(int N=0,int T=0):ne(N),to(T){}
}e[MAXN<<1];
int fir[MAXN], num = 0;
inline void join(int a, int b)
{
e[++num] = edge(fir[a], b);
fir[a] = num;
}
int buf[MAXN], *f[MAXN], *now = buf, dep[MAXN], son[MAXN], fa[MAXN];
void predfs(int u, int pa)
{
fa[u] = pa;
for(int i=fir[u],v;i;i=e[i].ne) if((v = e[i].to) != pa)
{
predfs(v, u);
dep[u] = max(dep[u], dep[v]+1);
if(dep[son[u]] < dep[v]) son[u] = v;
}
dep[u] = dep[son[u]] + 1;
}
void dfs(int u)
{
f[u][0] = 1;
if(son[u])
{
f[son[u]] = f[u] + 1;
dfs(son[u]);
if(K-1 < dep[son[u]]) f[u][0] += f[son[u]][K-1];
f[u][0] = max(f[u][1], f[u][0]);
}
for(int i=fir[u],v;i;i=e[i].ne) if((v=e[i].to) != fa[u] && v != son[u])
{
f[v] = now; now += dep[v];
dfs(v);
for(int j=0;j<=dep[v];j++)
{
int k = max(j, K-j);
f[u][j] = max(((k) ? (j<dep[u]?f[u][j]:0) + (k<=dep[v]?f[v][k-1]:0) : 0), (j ? (k<dep[u]?f[u][k]:0) + f[v][j-1] : 0));
}
for(int j=dep[v];~j;j--) f[u][j] = max(f[u][j], j==dep[u]-1?0:f[u][j+1]);
}
} int main()
{
scanf("%d%d",&n,&K);
for(int i=2,x;i<=n;i++)
{
scanf("%d",&x);
join(i, ++x);
join(x, i);
}
predfs(1, 0);
f[1] = now; now += dep[1];
dfs(1);
printf("%d\n",f[1][0]);
return 0;
}

[BalticOI 2017] Cat in a tree的更多相关文章

  1. 洛谷 P6573 [BalticOI 2017] Toll 题解

    Link 算是回归OI后第一道自己写的题(考CSP的时候可没回归) 写篇题解纪念一下 题目大意: \(n\) 个点,\(m\) 条单向边,每条边的两端点 \(x\),\(y\)必定满足 \(\left ...

  2. LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal (用中序和后序树遍历来建立二叉树)

    Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  3. LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal (用先序和中序树遍历来建立二叉树)

    Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  4. 大众点评CAT开源监控系统剖析

    参考文档: 大众点评的实时监控系统分析(一) CAT_source_analyze 透过CAT,来看分布式实时监控系统的设计与实现 深度剖析开源分布式监控CAT [分布式监控CAT] Client端源 ...

  5. 【转】大众点评CAT开源监控系统剖析

    https://www.cnblogs.com/yeahwell/p/cat.html 参考文档: 大众点评的实时监控系统分析(一) CAT_source_analyze 透过CAT,来看分布式实时监 ...

  6. 对word2vec的理解及资料整理

    对word2vec的理解及资料整理 无他,在网上看到好多对word2vec的介绍,当然也有写的比较认真的,但是自己学习过程中还是看了好多才明白,这里按照自己整理梳理一下资料,形成提纲以便学习. 介绍较 ...

  7. 贪心/构造/DP 杂题选做Ⅲ

    颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...

  8. 转载:《TypeScript 中文入门教程》 7、模块

    版权 文章转载自:https://github.com/zhongsp 建议您直接跳转到上面的网址查看最新版本. 关于术语的一点说明: 请务必注意一点,TypeScript 1.5里术语名已经发生了变 ...

  9. CBOW and Skip-gram model

    转自:https://iksinc.wordpress.com/tag/continuous-bag-of-words-cbow/ 清晰易懂. Vector space model is well k ...

  10. POJ 2192 :Zipper(DP)

    http://poj.org/problem?id=2192 Zipper Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1 ...

随机推荐

  1. vue实现图片上传且实时预览

    <div class="up-img"> <div class="imgList"> <ul> <li v-for=& ...

  2. 前端面试题 10 个「有用」JavaScript 代码片段

    携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情 降低阅读负担,启发创作心智,轻松学习 JavaScript 技巧,日拱一卒,jym,冲~ 注:本篇可能更 ...

  3. chatGPT搭建之旅

    昨天接到领导需求,要我搭建一个chatGPT玩玩,并给了一个链接地址:https://gitee.com/RockChin/QChatGPT 然后历经千辛万苦,熬了一宿终于搭建了,中途踩了各种大坑小坑 ...

  4. Appium-TouchAction类与MultiAction类(控件元素的滑动、拖动,九宫格解锁,手势操作等)

    文章转自:https://www.cnblogs.com/lfr0123/p/13679568.html swipe一般用于对页面进行上下左右滑动操作,但自动化过程中还会遇到其他情况,如对控件元素进行 ...

  5. 081_Introducing trigger handler class

    案例分析: 我们对一个Object写多个独立得Trigger. 但最终这不是最好的做法. 在Salesforce中,只为每个SObject设置一个触发器总是好的. 原因:每个独立触发器的执行顺序始终未 ...

  6. Fiddler 抓包转成*.har文件在httprunner执行

    1.Fiddler 抓包转成*.har 参考:https://blog.csdn.net/hou_angela/article/details/91837007 2.生成httprunner项目结构 ...

  7. Nextcloud报 PHP zip 模块未安装

    wget https://pecl.php.net/get/zip自动下载最新包 tar xf zip-1.20.0.tgz cd zip-1.20.0/ phpize 报错system libzip ...

  8. rtsp协议转换m3u8

    目前项目中使用海康的摄像头,但需要提供实时预览.目前通过转换协议实现预览.同时能够尽量减少服务器的压力,比如生成的ts文件个数. 思路 通过ffmpeg 将rtsp协议转换成hls协议 具体步骤 1. ...

  9. Win10桌面点鼠标右键一直转圈的解决方法

    win10桌面右键菜单就一直转圈,无法调出桌面右键菜单,下面给大家分享一下怎么解决的问题,一起了解一下!            步骤阅读   工具/原料   win10 企业版 HT1902 方法/步 ...

  10. 小白之Python-基础中的基础04

    继续.. ------------------------华丽的分界线----------------------------- Python-基础中的基础04 --之方法 格式:对象.方法() 1. ...