首页 > 其他分享 >D. Book of Evil

D. Book of Evil

时间:2024-07-15 14:30:11浏览次数:6  
标签:fa int Evil next height start Book now

原题链接

题解

题目要求有多少个点,其到标记点的最远距离不超过 \(d\)

看到这个我们不难想到树的直径:设直径端点 \(a,b\),树上任意一点 \(c\) 到叶子节点的距离 \(\leq max(d(c,a),d(c,b))\)

所以,我们把标记点看成叶子节点,并找出相距最远的一对标记点 \(ab\),如果某点与 \(a,b\) 的距离都不超过 \(d\) 则与其他标记点的距离也不会超过 \(d\)

(如果有非标记点,在叶子节点的“外侧”,该性质依然成立)

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;

vector<int> G[100004];
bool mark[100005]={0};

int maxh=0;
int node1;
int node2;

void dfs(int now,int fa,int height)
{

    if(height>maxh&&mark[now])
    {
        maxh=height;
        node1=now;
    }
    for(auto next:G[now])
    {
        if(next==fa) continue;
        dfs(next,now,height+1);
    }
}

int ans[100005]={0};
int n,m,d;

void dfs1(int now,int fa,int height)
{
    if(height<=d) ans[now]++;
    if(height>maxh&&mark[now])
    {
        maxh=height;
        node2=now;
    }
    for(auto next:G[now])
    {
        if(next==fa) continue;
        dfs1(next,now,height+1);
    }
}

void dfs2(int now,int fa,int height)
{
    if(height<=d) ans[now]++;

    for(auto next:G[now])
    {
        if(next==fa) continue;
        dfs2(next,now,height+1);
    }
}


void solve()
{
    cin>>n>>m>>d;

    int start;
    for(int i=1;i<=m;i++)
    {
        int x;
        cin>>x;
        mark[x]=1;
        start=x;
    }

    for(int i=1;i<n;i++)
    {
        int x,y;
        cin>>x>>y;
        G[x].push_back(y);
        G[y].push_back(x);
    }

    node1=start;
    dfs(start,start,0);

    maxh=0;
    node2=start;
    dfs1(node1,node1,0);

    dfs2(node2,node2,0);

    int sum=0;
    for(int i=1;i<=n;i++) sum+=(ans[i]==2);
    cout<<sum<<'\n';
}
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int t=1;
    //cin>>t;
    while(t--) solve();
    return 0;
}


标签:fa,int,Evil,next,height,start,Book,now
From: https://www.cnblogs.com/pure4knowledge/p/18303102

相关文章

  • MacBook m1使用Qemu搭建Ubuntu虚拟机
    虽然macOS和Linux类似,但毕竟不同。学习Linux,就需要一个真实的Linux环境,思来想去,决定用qemu装一个Ubuntu虚拟机。liheng@~$sw_versProductName: macOSProductVersion: 14.5BuildVersion: 23F79安装brewhttps://brew.idayer.com/guide/m1/安装qemubrewinstallqemul......
  • 5.1编写ansibleplaybook批量安装二进制
    本节重点介绍:ansibleplaybook编写rsyslog和logrotateservice_deployyaml的编写配置机器直接的ssh免密码登录节点主机名host解析节点主机名写入hostsecho"192.168.3.200prome-master01">>/etc/hostsecho"192.168.3.201prome-node01">>/etc/hosts......
  • 【Python】jupyter notebook平台的使用·
    目录一、安装Anaconda二、将BreadCancer.zip上传到jupyter notebook平台中三、了解BreadCancerClassifier.ipynb文件在jupyternotebook的单元格中的python代码,并运行。3.1 导入mainFun文件3.2 读入数据3.3开始训练3.4读入测试数据3.5 开始测试3.6 开始统计3......
  • 苹果电脑可以玩魔兽世界吗 魔兽世界有mac版本么 macbook 可以玩魔兽世界吗
    在苹果电脑(Mac)上玩魔兽世界(WorldofWarcraft)是许多玩家的愿望。虽然魔兽世界本身是跨平台的游戏,支持Windows和Mac系统,由于官方版本更新不同步等情况,有些玩家可能会考虑在虚拟机中运行游戏,本文将探讨如何在Mac上玩魔兽世界。一、直接在Mac上玩魔兽世界魔兽世界是暴雪娱乐(Bl......
  • Facebook开户&FB海外三不限企业户如何开户
    Facebook是世界上最大的社交媒体平台之一,吸引了全球数十亿的用户。Facebook已经成为了海外代投公司中不可或缺的一部分,这个社交媒体平台的广泛使用和用户数量的增长为海外代投业务提供了巨大的机遇和挑战。许多跨境电商人就需要开广告账户进行推广,本文就介绍Facebook的广告账户......
  • B. Area of the Devil
    借这道题夯实一下计算几何的基础向量积:顺负逆正两线交点和夹角都是借助向量工具求解的分类讨论:圆弧小于180度时,减去三角形面积;大于180度时,加上三角形面积割补法求面积(正难则反)C++中的角度以弧度制表示点击查看代码#include<bits/stdc++.h>#definepddpair<double,dou......
  • Matebook14 2020款 更换固态(全流程)
    Matebook142020款更换固态全流程因为工作的原因需要升级存储,我的老款的Matebook14只有512G。网络上的中文教程普遍比较古老。特此写下这篇笔记希望能帮助到有需要的朋友。工具螺丝刀(四花00和六花T4)新的固态硬盘U盘(容量不小于1G)移动硬盘(容量不能小于你的系统镜像)操作流......
  • jupyter notebook
    jupyter简单介绍:Jupyter:是一个开源的Web应用程序,允许创建和共享包含实时代码、方程、可视化和解释性文本的文档。广泛用于数据清理和转换、数值模拟、统计建模、机器学习等领域。Jupyter的主要特点包括:1.交互式编程:Jupyter允许用户在文档中直接编写代码,并即时运行和查看结......
  • 4 Ansible Playbook
    1AnsiblePlaybook简介Ansible靠ansible命令是撑不起自动化管理这把大伞的,Ansible真正强大的是playbook,它才是Ansible撬动自动化管理的结实杠杆。ansbile-playbook是一系列ansible命令的集合,利用yaml语言编写。playbook命令根据自上而下的顺序依次执行。同时,playbook开创了很......
  • Facebook开企业户&Facebook BM是什么?
    FacebookBM是Facebook针对广告投放,为广告主提供的一项一站式管理服务,全称是BusinessManager(商务管理平台)。它是一个免费工具,可以帮助卖家在一个版块中进行广告投放、查看、追踪,以及进行主页管理、广告账户管理、经销商合作等业务管理。具体来说,FacebookBM的主要功能包括:......