NOIP2023模拟3联测24-博弈树

news/2024/7/20 22:34:48 标签: 深度优先, 图论, 算法

Alice \text{Alice} Alice Bob \text{Bob} Bob 又开始玩游戏了,他们已经把石子堆得比山还高了,现在他们要玩一种更新奇的游戏,这种游戏的规则如下:

  • 给定一颗 n n n 个节点的树, Alice \text{Alice} Alice Bob \text{Bob} Bob 随机选择一个节点作为起点放上棋子,由 Alice \text{Alice} Alice 先手。
  • 轮到一方后可以将这颗棋子移动到树上任意一点,每次一方移动的距离必须比对方上一次移动的距离还要大,开始时默认为 0 0 0
  • 当一方不能再次移动之后判负。

现在 Alice \text{Alice} Alice Bob \text{Bob} Bob 已经找到了一棵节点编号为 1 ∼ n 1∼n 1n 的树准备开始游戏,作为博弈高手, Alice \text{Alice} Alice Bob \text{Bob} Bob 均会做出最优的选择,选择一个节点后,他们知道游戏必然有一种必胜策略,现在他们想知道游戏的胜负,他们会询问你 q q q 次,每次他们会选择一个节点询问,你只需要回答在最优策略下以这个为节点为起点的胜者是谁即可。


由于每次移动的距离递增,考虑距离最大的时候,就是树的直径。这里的直径定义为一条包含最多点的路径。

显然,若一个点直径的一端,先手放这里一定会赢。于是“删除”原树上所有直径端点。

考虑现在的树的直径,现在树的直径的端点先手也是必胜的:如果先手放这里,先手可以把棋子移到现在直径的另一个端点,后手就只能移到原树直径的端点,先手移到另一个原树直径的端点,后手就操作不了了。

这样子每次删去直径的端点,直径的长度减少 2 2 2(仔细想想)。那么如果最后减少到 1 1 1 时,放这个点先手必败;如果最后减少到 2 2 2,显然先手必胜。

结论:如果树的直径长度是奇数,那么直径中间那个点 Bob \text{Bob} Bob 必胜,否则 Alice \text{Alice} Alice 必胜;如果是偶数,所有的点都是 Alice \text{Alice} Alice 必胜。

题外话,赛时我打了 70pts 暴力,剩下的就总司令(全输出 Alice \text{Alice} Alice),拿下 95pts。不可以,总司令!

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
int n,q,maxdep,D;
int head[N],nxt[N<<1],to[N<<1],cnt,dep[N],fa[N];
void add(int u,int v)
{
    to[++cnt]=v;
    nxt[cnt]=head[u];
    head[u]=cnt;
}
void dfs(int u,int f)
{
    dep[u]=dep[f]+1;
    fa[u]=f;
    if(maxdep<dep[u]){
        maxdep=dep[u];
        D=u;
    }
    for(int i=head[u];i;i=nxt[i]) if(to[i]!=f) dfs(to[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);
    maxdep=0;
    dfs(D,0);
    if(maxdep&1){
        for(int i=1;i*2<maxdep;i++) D=fa[D];
        while(q--){
            int x;
            scanf("%d",&x);
            puts(x^D?"Alice":"Bob");
        }
    }
    else while(q--) puts("Alice");
}

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

相关文章

CVE-2021-21234 spring-boot-actuator-logview目录遍历漏洞

0x01 影响版本 Spring-Boot-Actuator-logview < 0.2.13 0x02 漏洞分析 源码中对filename进行了校验但并未对路径进行校验 校验函数如下&#xff1a; 0x03 漏洞复现 首先开vulhub的镜像 点击下载&#xff0c;原数据包如下 送入repeater打入payload&#xff0c;复现…

大数据之LibrA数据库常见术语(六)

客户端 连接或请求其它计算机或程序服务的计算机或程序。 空闲空间管理 管理表内空闲空间的机制&#xff0c;通过记录每个表内空闲空间信息&#xff0c;并建立易于查找的数据结构&#xff0c;可以加速对空闲空间进行的操作&#xff08;例如INSERT&#xff09;。 LLVM LLVM命…

ETO制造商目前面临的六大挑战,如何应对?

与离散制造、库存制造不同&#xff0c;按订单设计制造&#xff08;ETO&#xff09;行业面临着一系列独特的挑战。从复杂的产品设计到与客户的密切联系&#xff0c;按订单生产的每件产品都不尽相同。 如果采用按订单生产方式制造产品&#xff0c;管理者总是会想方设法采购最好的…

如何在宝塔面板安装配置MySQL数据库并实现公网访问

宝塔安装MySQL数据库&#xff0c;并内网穿透实现公网远程访问 文章目录 宝塔安装MySQL数据库&#xff0c;并内网穿透实现公网远程访问前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网…

知识付费系统的技术架构和设计原则

知识付费系统的成功取决于其坚实的技术架构和设计原则。本文将探讨创建一个高效、可扩展和安全的知识付费系统所需的技术要素和设计原则&#xff0c;并提供一些示例代码&#xff0c;以帮助您开始构建自己的系统。 技术架构 1. 后端服务 知识付费系统的后端服务是其核心组成部分…

【shell】awk 中可以使用的方法

awk是一种强大的文本处理工具&#xff0c;它提供了许多方法来处理和操作文本数据。除了你提到的print、index和substr&#xff0c;awk还提供了其他一些常用方法。以下是一些常见的awk方法&#xff1a; print&#xff1a;用于打印指定的字段或表达式。这是awk中最常用的方法之一…

东莞市交投集团供应链服务平台上线啦

依托东莞热土&#xff0c;深耕交通产业&#xff0c;东莞市交通投资集团有公司&#xff08;以下简称“东莞市交投集团”&#xff09;坚持规范经营&#xff0c;不断创新发展&#xff0c;发展成为集公路桥梁及轨道交通工程投资建设经营、城市公交、水上客运、数字交通、智慧停车、…

ssh连接远程服务器,并在终端安装anaconda

官网下载安装&#xff1a;anaconda2023.09版本&#xff08;官网地址&#xff1a;https://www.anaconda.com/download#downloads&#xff09; wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh使用阿里云镜像下载安装&#xff0c;官网下载太慢。阿…