【NOIP模拟】怪兽
题面
大 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模拟】怪兽相关推荐
- python实现dnf自动刷怪_【python】模拟打怪游戏:怪兽(monster),玩家(hero)
游戏模式: 假设有怪兽(monster)和英雄(hero)两个角色,二者为敌对状态 假设两个角色初始血量为100,攻击力的伤害服从随机分布(7,17),二者相互攻击,判断谁获胜? # # 定义精灵 c ...
- python游戏开发思路:模拟打怪游戏(决策论),怪兽(monster),玩家(hero)
游戏模式: 假设有怪兽(monster)和英雄(hero)两个角色,二者为敌对状态 假设两个角色初始血量为100,攻击力的伤害服从随机分布(7,17),二者相互攻击,判断谁获胜? import ran ...
- 闵梓轩大佬のnoip模拟题D1 总结 2017/10/26
背景 题目概括 T1 题面 分析 90分算法 满分算法 T2 题面 分析 部分分算法 满分算法 满分代码 T3 题面 分析 代码 总结 背景 这道题目是去年的金牌大佬闵梓轩在一年前出的一套noip模拟 ...
- jyzy noip模拟赛5.22-2
不知道哪来的题 jyzy noip模拟赛5.22-2 样例输入 1 2 3 4 样例输出 0.200000000000000 数据 |a|,|b|,|c|,|d|<=1e9 很多大佬迅速想到二分 ...
- 【Unity入门】25.零基础实现游戏Demo--神鸟大战怪兽
[Unity入门]零基础实现游戏Demo--神鸟大战怪兽 大家好,我是Lampard~~ 欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 (一) 前言 经过了 ...
- 发布 128 核 Altra Max,自研内核,明年推出 5nm 处理器,“性能怪兽”Ampere 搞大事?...
作者 | 伍杏玲 出品 | AI 科技大本营(ID:rgznai100) 头图 | 下载于ICphoto 2015 年,在英特尔就职 28 年的总裁 Renee James 辞职,正在大众纷纷猜测她将 ...
- 新版蚂蚁网有抄袭怪兽吗?
昨天晚上看我在TECHWEB的博客,有人回复说蚂蚁新版有抄怪兽的嫌疑,我先是一愣,麦田会抄我们吗? Re:艰难的原创--谈互联网创业 你TMD傻啊,[url]http://beta.mayi.com[ ...
- NOI.AC NOIP模拟赛 第六场 游记
NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...
- 谷歌上线AI新玩法:随手乱涂鸦,一键变怪兽
蕾师师 发自 凹非寺 量子位 报道 | 公众号 QbitAI 小明随意地涂鸦了一个头部,再简单地画了个翅膀,加上一个大尾巴--再单击「转换」键. 一只面目狰狞.皮肤粗糙.纹理细致的大怪兽就创造出来了 ...
最新文章
- Hey!你的 CSDN 年度报告已出炉,请查收~
- php开启path_info,Nginx + php-fpm 开启 PATH_INFO 模式
- 牛逼哄哄的SLAM技术即将颠覆哪些领域
- 移动开发的罗曼蒂克消亡史
- CAS 5.2.x 单点登录 - 实现原理及源码浅析
- Java八大基本数据类型和对应的封装类型
- sap原因代码配置路径_如何根据SAP Table找到对应IMG配置?
- Advanced Logging For IIS
- 2013-2017蓝桥杯省赛C++A组真题总结(题型及解法)
- ubuntu vnc安装
- ubuntu14上安装ros教程
- android md5加密工具下载,md5校验工具下载
- 百度违规屏蔽词过滤查询工具
- 惠普HP Deskjet D1530 打印机驱动
- layui iframe弹出层高度自适应,并垂直居中
- 企业视频直播平台有哪些呢
- python批量裁剪图像
- spring cloud contract的应用实现与概念理解-服务请求者一侧的落地-细节较多避免踩坑卡壳
- Java物联网企业级项目 亿可控系统分析与设计
- MAC安装USB转串口驱动