题面

大 M 是一只怪兽,准备到比特王国吃人。比特王国有 n 个城市,城市之间由 n-1 条无向的路径连接,通过每条路径的时间为 1。其中有 m 个特别的城市,这 m 个 城市里都各有一个大神,于是大 M 打算不管普通人,只吃掉这些大神。然而大 M 是 一只具有特别能力的怪物,它可以一开始降临到 n 个城市中的任意一个城市,同时还 有一次机会在任意两个城市间打开一个虫洞,不消耗时间就能相互到达。 大 M 想知道它最少要花多少时间来吃掉这些大神(吃的时间忽略不计),如 果你不帮它它就会吃了你。 当然,大 M 是不属于这个时空的存在,所以在他吃完所有大神之后需要回到 最初降临的城市,通过时空门返回原来的位面。虫洞只能走一次。

第 1 行输出一个整数表示为了时间最短,大 M 一开始应该降临在哪个城市 (如果有多个最短时间则输出序号最小的城市编号)。 第 2 行输出一个整数表示能达到的最短时间。1<=m<=n<=123456。

分析

这题其实挺妙,按一般树形dp的思维能做,但是这一种思路更妙。

首先很显然,所有标记了的大神点的父亲必须走,把这些点标记出来,再把一条直路上的父亲结点略去,之间将最远的祖先与大神点的边权设为中间经过的边数。

如下图,在这样一棵生成的树上的所有点都必须走,且从任意一点出发都是等效的,这解决了我们第一个问题,直接生成树上找一个序号最小的点。

而代价呢?其实就是边权之和*2-树的直径,因为有了要回到起点的条件,所以边都要走两遍,而虫洞自然建在距离最远的两点,即直径上两点。

代码

#include<bits/stdc++.h>
using namespace std;
#define N 200000
int n,m,k,p,st,cnt,cot,dis,ans;
int d[N],mark[N],siz[N],first[N],head[N];
struct email
{int u,v,w;int nxt;
}e[N*2],g[N*2];
inline void add(int u,int v)
{e[++cnt].nxt=first[u];first[u]=cnt;e[cnt].u=u;e[cnt].v=v;
}
inline void readd(int u,int v,int w)
{g[++cot].nxt=head[u];head[u]=cot;g[cot].u=u;g[cot].v=v;g[cot].w=w;
}void dfs(int u,int fa)
{siz[u]=mark[u];for(int i=first[u];i;i=e[i].nxt){int v=e[i].v;if(v==fa)continue;dfs(v,u);siz[u]+=siz[v];}
}void dfs1(int u,int fa,int top,int w)
{int dalao=0;for(int i=first[u];i;i=e[i].nxt){int v=e[i].v;if(v==fa)continue;if(siz[v])dalao++;}if(dalao>1||mark[u]){if(top)readd(u,top,w),readd(top,u,w);top=u;w=0;}for(int i=first[u];i;i=e[i].nxt){int v=e[i].v;if(v==fa||siz[v]==0)continue;dfs1(v,u,top,w+1);}
}
inline void dfs2(int u,int fa)
{for(int i=head[u];i;i=g[i].nxt){int v=g[i].v,w=g[i].w;if(v==fa)continue;d[v]=d[u]+w;dfs2(v,u);}
}int main()
{scanf("%d%d",&n,&m);for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);add(u,v);add(v,u);}for(int i=1;i<=m;i++)scanf("%d",&k),mark[k]=1;st=n;dfs(1,0);dfs1(1,0,0,0);dfs2(k,0);for(int i=1;i<=n;i++)if(d[i]>dis)dis=d[i],p=i;memset(d,0,sizeof(d));dfs2(p,0);for(int i=1;i<=n;i++)dis=max(dis,d[i]);for(int i=1;i<=cot;i++)st=min(st,min(g[i].v,g[i].u)),ans+=g[i].w;printf("%d\n%d\n",st,ans-dis);return 0;
}

转载于:https://www.cnblogs.com/NSD-email0820/p/9814339.html

【NOIP模拟】怪兽相关推荐

  1. python实现dnf自动刷怪_【python】模拟打怪游戏:怪兽(monster),玩家(hero)

    游戏模式: 假设有怪兽(monster)和英雄(hero)两个角色,二者为敌对状态 假设两个角色初始血量为100,攻击力的伤害服从随机分布(7,17),二者相互攻击,判断谁获胜? # # 定义精灵 c ...

  2. python游戏开发思路:模拟打怪游戏(决策论),怪兽(monster),玩家(hero)

    游戏模式: 假设有怪兽(monster)和英雄(hero)两个角色,二者为敌对状态 假设两个角色初始血量为100,攻击力的伤害服从随机分布(7,17),二者相互攻击,判断谁获胜? import ran ...

  3. 闵梓轩大佬のnoip模拟题D1 总结 2017/10/26

    背景 题目概括 T1 题面 分析 90分算法 满分算法 T2 题面 分析 部分分算法 满分算法 满分代码 T3 题面 分析 代码 总结 背景 这道题目是去年的金牌大佬闵梓轩在一年前出的一套noip模拟 ...

  4. jyzy noip模拟赛5.22-2

    不知道哪来的题 jyzy noip模拟赛5.22-2 样例输入 1 2 3 4 样例输出 0.200000000000000 数据 |a|,|b|,|c|,|d|<=1e9 很多大佬迅速想到二分 ...

  5. 【Unity入门】25.零基础实现游戏Demo--神鸟大战怪兽

    [Unity入门]零基础实现游戏Demo--神鸟大战怪兽     大家好,我是Lampard~~     欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢  (一) 前言     经过了 ...

  6. 发布 128 核 Altra Max,自研内核,明年推出 5nm 处理器,“性能怪兽”Ampere 搞大事?...

    作者 | 伍杏玲 出品 | AI 科技大本营(ID:rgznai100) 头图 | 下载于ICphoto 2015 年,在英特尔就职 28 年的总裁 Renee James 辞职,正在大众纷纷猜测她将 ...

  7. 新版蚂蚁网有抄袭怪兽吗?

    昨天晚上看我在TECHWEB的博客,有人回复说蚂蚁新版有抄怪兽的嫌疑,我先是一愣,麦田会抄我们吗? Re:艰难的原创--谈互联网创业 你TMD傻啊,[url]http://beta.mayi.com[ ...

  8. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  9. 谷歌上线AI新玩法:随手乱涂鸦,一键变怪兽

    蕾师师 发自 凹非寺  量子位 报道 | 公众号 QbitAI 小明随意地涂鸦了一个头部,再简单地画了个翅膀,加上一个大尾巴--再单击「转换」键. 一只面目狰狞.皮肤粗糙.纹理细致的大怪兽就创造出来了 ...

最新文章

  1. Hey!你的 CSDN 年度报告已出炉,请查收~
  2. php开启path_info,Nginx + php-fpm 开启 PATH_INFO 模式
  3. 牛逼哄哄的SLAM技术即将颠覆哪些领域
  4. 移动开发的罗曼蒂克消亡史
  5. CAS 5.2.x 单点登录 - 实现原理及源码浅析
  6. Java八大基本数据类型和对应的封装类型
  7. sap原因代码配置路径_如何根据SAP Table找到对应IMG配置?
  8. Advanced Logging For IIS
  9. 2013-2017蓝桥杯省赛C++A组真题总结(题型及解法)
  10. ubuntu vnc安装
  11. ubuntu14上安装ros教程
  12. android md5加密工具下载,md5校验工具下载
  13. 百度违规屏蔽词过滤查询工具
  14. 惠普HP Deskjet D1530 打印机驱动
  15. layui iframe弹出层高度自适应,并垂直居中
  16. 企业视频直播平台有哪些呢
  17. python批量裁剪图像
  18. spring cloud contract的应用实现与概念理解-服务请求者一侧的落地-细节较多避免踩坑卡壳
  19. Java物联网企业级项目 亿可控系统分析与设计
  20. MAC安装USB转串口驱动

热门文章

  1. python计算p-value
  2. 【杂项】笔记本键盘 “Win+字母“快捷组合键失效 解决过程记录
  3. 网络视频播放ZFPlayer
  4. 26岁的我离婚了!80后婚姻注定死在房子上!
  5. ESP32学习笔记(43)——SD卡使用(SDMMC方式)
  6. 毕业半年无工作经验的程序员面试会遇到哪些问题
  7. 计算机视觉竞赛技巧总结(二):图像分割基础篇
  8. 记录如何在Ubuntu 22.04安装无线网卡驱动
  9. Tensorflow 代码解析
  10. Linux系统值得一看的学习方法及路线图