2023NOIP A层联测18 博弈树

news/2025/2/21 14:43:11

题解

A A A和小 B B B在玩游戏,游戏规则如下:

  • 给定一棵有 n n n个节点的树,小 A A A和小 B B B会选择一个节点作为起点放上棋子
  • 游戏由小 A A A先手,轮到一方之后,玩家可以将棋子移动到树上任意一点,每次玩家移动的距离必须比对方上一次移动的距离大,开始时上一次的距离默认为 0 0 0
  • 当一方不能再移动时该玩家判负

A A A和小 B B B均采用最优策略。有 q q q次询问,每次询问会给出一个点 x x x,你需要回答以这个点为起点的情况下谁会赢。如果小 A A A会赢,输出 A l i c e Alice Alice;否则,输出 B o b Bob Bob

1 ≤ n , q ≤ 1 0 5 1\leq n,q\leq 10^5 1n,q105


题解

如果先手的位置在直径的端点上时,先手可以将棋子移到另一个端点上,而后手不能再移动,所以此时先手必胜。

我们考虑删除所有直径端点,得到一棵新的树,如果起点在这棵树的直径上,那么先手可以将棋子移到新树的另一个直径端点,后手为了能移动更大的距离,只能将棋子移到原树的直径上,那么后手的移动距离小于原树的直径的长度,先手可以将棋子移到原树上的另一个直径端点,所以还是先手必胜。

于是,我们可以将树的直径端点不断删下去,如果最终剩下一个点,则这个点是后手必胜的(因为先手无论如何都会把这个点移动到每一层的直径端点);否则,所有点都是先手必胜。

我们发现,原树直径的中点一定是删一层后树的直径中点,于是我们可以判断原树直径的长度是否为奇数(因为是奇数的话才会有中点),如果是的话就从直径的一端暴力跳到直径的终点即可。

时间复杂度为 O ( n ) O(n) O(n)

code

#include<bits/stdc++.h>
using namespace std;
const int N=100000;
int n,q,tot=0,d[2*N+5],l[2*N+5],r[N+5],dep[N+5],fa[N+5];
void add(int xx,int yy){
	l[++tot]=r[xx];d[tot]=yy;r[xx]=tot;
}
void dfs(int u,int f){
	fa[u]=f;
	dep[u]=dep[f]+1;
	for(int i=r[u];i;i=l[i]){
		if(d[i]==f) continue;
		dfs(d[i],u);
	}
}
int main()
{
//	freopen("tree.in","r",stdin);
//	freopen("tree.out","w",stdout);
	scanf("%d%d",&n,&q);
	for(int i=1,x,y;i<n;i++){
		scanf("%d%d",&x,&y);
		add(x,y);add(y,x);
	}
	dfs(1,0);
	int v1=0,v2=0,vb=0;
	for(int i=1;i<=n;i++){
		if(dep[i]>dep[v1]) v1=i;
	}
	dfs(v1,0);
	for(int i=1;i<=n;i++){
		if(dep[i]>dep[v2]) v2=i;
	}
	if(dep[v2]&1){
		vb=v2;
		for(int i=1;i<=dep[v2]/2;i++) vb=fa[vb];
	}
	for(int i=1,x;i<=q;i++){
		scanf("%d",&x);
		if(x==vb) printf("Bob\n");
		else printf("Alice\n");
	}
	return 0;
}

http://www.niftyadmin.cn/n/5125096.html

相关文章

drawio特性

drawio的特性 drawio是领先的基于Web技术的草图和图表功能功能的应用。 保证数据的安全 集成了各种不同的平台&#xff0c;和提供了在线的免费编辑器&#xff0c;可以使用app.diagrams.net来方案&#xff0c;drawio本身不会存储用户的数据。 随着互联网时代的发展&#xff0…

【Qt之QtConcurrent】描述及使用

描述 QtConcurrent是一个Qt库中的模块&#xff0c;用于实现多线程并发编程。它提供了一些高级API&#xff0c;使得在多核处理器上并行执行代码变得更加容易。 示例&#xff1a; 使用的话&#xff0c; 需要在pro文件中添加&#xff1a;QT concurrent模块。 #include <QC…

Kernel: network:问题分析一例,包从二层到了三层,却没有到四层

现象&#xff0c;使用tcpdump命令可以抓到进来的包&#xff0c;但是使用strace看程序&#xff0c;却没有在socket上收到数据。 通过 nstat/netstat/ip-s/ethtoo-S/看各种计数&#xff0c;发现没有错误的包。 也没看到iptables的设置&#xff1b; 也没有防火墙的设置&#xff1b…

Python之作业(三)

Python之作业&#xff08;三&#xff09; 练习题 给出3个整数&#xff0c;使用if语句判断大小&#xff0c;并升序输出有一个列表lst [1,4,9,16,2,5,10,15],生成一个新列表&#xff0c;要求新列表元素是lst相邻2项的和随机生成100个产品ID&#xff0c;ID格式如下 顺序的数字6…

Three.js 基础纹理贴图

本文简介 带尬猴&#xff0c;我嗨德育处主任 尽管 Three.js 文档已经比较详细了&#xff0c;但对于刚接触 Three.js 的工友来说&#xff0c;最麻烦的还是不懂如何组合。Three.js 的功能实在太多了&#xff0c;初学者很容易被大量的新概念冲晕。 本文主要讲解入门 Three.js 必…

音视频开发常见问题(五):视频黑屏

摘要 本文介绍了视频黑屏的可能原因和解决方案。主要原因包括用户主动关闭视频、网络问题和渲染问题。解决方案包括优化网络稳定性、确保视频渲染视图设置正确、提供清晰的提示、实时监测网络质量、使用详细的日志系统、开启视频预览功能、使用视频流回调、处理编解码问题、处…

app分发有哪些坑?

app分发经常会掉进那些坑里呢&#xff1f;我给大家分享一下的我的经验。 app分发平台&#xff0c;就是很多app开发类的企业都会经常用到的一种平台&#xff0c;主要是通过把开发好的app&#xff0c;上传至app分发平台进行内测下载&#xff0c;app分发平台不仅可以提供app的内测…

企业安全—DevSecOps概述详情

0x00 前言 SDL存在的问题在于体量过于庞大&#xff0c;不利于快速进行适配和进行&#xff0c;所以就有了DevSecOps&#xff0c;实际上是因为敏捷开发也就是DevOps的推进&#xff0c;并且坐上了云服务模式的火车&#xff0c;所以这一系列的东西都开始普及。DevSecOps作为DevOps…