Luogu P3942 将军令
2024-09-05 15:55:18
题目
维护每个点子树中最深的没有被覆盖的点(仅计算这条链上的关键点)的距离。
若\(u\)为关键点,则\(d_u=-k-1\)。
记录\(mx=\max\limits_{v\in son_u}d_v+1,min=\min\limits_{v\in son_u}d_v+1\)。
如果\(mx+mn<0\),那么说明这个点的子树已经全被覆盖了,那么\(d_u=mn\)。(这里是考虑到别的链上的关键点覆盖了这个点的子树)
否则这个点的子树没有全被覆盖,最深的没有被覆盖的点的深度依旧是\(mx\),\(d_u=mx\)。
如果\(d_u\ge k\),那么我们就在这个点设置一个关键点。
最后如果\(d_1\ge0\)就要继续答案加一。
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int N=1e5+1;
int n,k,ans,d[N];
vector<int>E[N];
int read(){int x;scanf("%d",&x);return x;}
void max(int &a,int b){a=a>b? a:b;}
void min(int &a,int b){a=a<b? a:b;}
void dfs(int u,int fa)
{
int mx=0,mn=k+1;
for(int v:E[u]) if(v^fa) dfs(v,u),max(mx,d[v]+1),min(mn,d[v]+1);
if((d[u]=(mx+mn<0? mn:mx))>=k) d[u]=-k-1,++ans;
}
int main()
{
n=read(),k=read(),read();int i,u,v;
for(i=1;i<n;++i) u=read(),v=read(),E[u].pb(v),E[v].pb(u);
if(dfs(1,0),d[1]>=0) ++ans;
return !printf("%d",ans);
}
最新文章
- iOS 关于PCH文件(全局文件)的介绍
- curl get
- jsoup
- CodeForces - 404A(模拟题)
- 解决phpMyAdmin中缺少mysqli扩展的错误
- 20160509-hibernate--继承映射
- 思维导图之C++语言程序设计总结
- css3中“渐变”兼容性解决方案
- Java并发编程--线程池
- POI读取excel工具类(xls,xlsx通用)
- 最好还是用#pragma once
- js+ajax编码三级联动
- css入门第一天
- [转] 前后端分手大师——MVVM 模式
- windows NT的意义和各个版本
- Python 自动发送邮件
- 北大poj- 1032
- jQuery-全屏滚动插件【fullPage.js】API 使用方法总结
- luoguP3920 [WC2014]紫荆花之恋 动态点分治 + 替罪羊树
- 用开源项目PhotoView实现图片的双指缩放和双击放大缩小
热门文章
- 51 Nod 1627瞬间移动(插板法!)
- Codeforces Round #584 - Dasha Code Championship - Elimination Round (rated, open for everyone, Div. 1 + Div. 2) G1. Into Blocks (easy version)
- JavaWeb_ XML文件
- 代理模式与AOP
- 20191031-2 Beta阶段贡献分配规则
- python利器之切片
- var $this = $(this)
- PHP基本语句
- visual studio运行时库MT、MTd、MD、MDd
- 正则表达式中常用的模式修正符有i、g、m、s、x、e详解