首页 > 其他分享 >NOIP2023模拟3联测24-博弈树

NOIP2023模拟3联测24-博弈树

时间:2023-10-26 21:48:32浏览次数:35  
标签:24 Alice 必胜 联测 NOIP2023 Bob 节点

NOIP2023模拟3联测24-博弈树

目录

题目大意

\(Alice\) 和 \(Bob\) 又开始玩游戏了: 给定一颗 \(n\) 个节点的树,\(Alice\) 和 \(Bob\) 随机选择一个节点作为起点放上棋子,由 Alice 先手。 轮到一方后可以将这颗棋子移动到树上任意一点,每次一方移动的距离必须比对 方上一次移动的距离还要大,开始时默认为 0 。 •当一方不能再次移动之后判负。 现在 Alice 和 Bob 已经找到了一棵节点编号为 \(1 ∼ n\) 的树准备开始游戏,作为博弈 高手,\(Alice\) 和 \(Bob\) 均会做出最优的选择,选择一个节点后,他们知道游戏必然有一种 必胜策略,现在他们想知道游戏的胜负,他们会询问你 \(q\) 次,每次他们会选择一个节点 询问,你只需要回答在最优策略下以这个为节点为起点的胜者是谁即可。

\(1\le n , q \le 10^5\)

思路

显然一棵树的最长路就是直径,所以当一个人走了与直径一样长的路径的时候必胜。

现在我们假设这棵树形成了一条链,显然只有在这条链的长度是奇数且起始点在中点时先手才必败,否则先手必胜。

我们开始不断删点,每次把当前树的直径的端点删掉,如果最后能够剩下一个点,那么先手必败,否则先手必胜。

我们发现这个最后剩下的那个点一定是原树上所有直径的交点,也是他们的中点。

所以只要只有在这个树的直径是奇数且起始点在直径的中点时先手才必败,否则先手必胜。

code

#include <bits/stdc++.h>
#define fu(x , y , z) for(int x = y ; x <= z ; x ++)
using namespace std;
const int N = 1e5 + 5;
int fa[N] , n , q , dep[N] , dis[N] , hd[N] , cnt , d , ans[N];
struct E {
    int to , nt;
} e[N << 1];
void add (int x , int y) { e[++cnt].to = y , e[cnt].nt = hd[x] , hd[x] = cnt; }
void dfs1 (int x) {
    int y;
    for (int i = hd[x] ; i ; i = e[i].nt) {
        y = e[i].to;
        if (y == fa[x]) continue;
        dep[y] = dep[x] + 1;
        fa[y] = x;
        dis[y] = dis[x] + 1;
        dfs1 (y);
    }
}
void dfs2 (int x , int lst) {
    int y;
    for (int i = hd[x] ; i ; i = e[i].nt) {
        y = e[i].to;
        if (y == lst) continue;
        dis[y] = dis[x] + 1;
        dfs2 (y , x);
    }
}
void solve (int x , int y) {
    int sum1 = 1 , sum2 = d;
    if (dep[x] < dep[y]) swap (x , y);
    while (dep[x] != dep[y]) {
        ans[sum1] = x;
        sum1 ++;
        x = fa[x];
    }
    if (sum1 == d) return;
    while (x != y) {
        ans[sum1] = x;
        ans[sum2] = y;
        sum1 ++;
        sum2 --;
        x = fa[x];
        y = fa[y];
    }
    if (d & 1) ans[sum1] = x;
}
int main () {
    freopen ("tree.in" , "r" , stdin);
    freopen ("tree.out" , "w" , stdout);
    int u , v;
    scanf ("%d%d" , &n , &q);
    if (n == 1) {
        while (q --) puts ("Bob"); 
        return 0;
    }
    fu (i , 1 , n - 1) {
        scanf ("%d%d" , &u , &v);
        add (u , v) , add (v , u);
    }
    dfs1 (1);
    int max1 = 0 , pos1 , pos2;
    fu (i , 1 , n) {
        if (max1 < dis[i]) {
            max1 = dis[i];
            pos1 = i;
        }
    }
    
    memset (dis , 0 , sizeof (dis));
    dfs2 (pos1 , 0);
    max1 = 0;
    fu (i , 1 , n) {
        if (max1 < dis[i]) {
            max1 = dis[i];
            pos2 = i;
        }
    }
    d = max1 + 1;
    solve (pos1 , pos2);
    int mid = ans[d / 2 + 1];
    while (q --) {
        scanf ("%d" , &pos1);
        if (d & 1 && pos1 == mid) puts ("Bob");
        else puts ("Alice"); 
    }
}

标签:24,Alice,必胜,联测,NOIP2023,Bob,节点
From: https://www.cnblogs.com/2020fengziyang/p/17790460.html

相关文章

  • 2023-2024 20231313《计算机基础与程序设计》第五周学习总结
    2023-202420231313《计算机基础与程序设计》第五周学习总结作业速达作业课程班级链接作业要求计算机基础与程序设计第五周学习总结作业内容计算机科学概论第6章、《C语言程序设计》第4章并完成云班课测试————>Pep/9虚拟机、机器语言与汇编语言、算法与伪......
  • 2023-2024-1 20211108_20211120_20211103_20211125 实验一:开发环境的熟悉 小组实验过
    实验课小组成员20211108俞振阳、20211120刘钟徽、20211103白皓宇、20211125苗靖章实验一-1-交叉编译环境-(使用自己笔记本电脑)实验题目要求实验三人一组可以使用自己的笔记本,也可以使用实验室台式机,使用实验室机器的不用做本题安装老师提供的software目录中的VMware-works......
  • 20211325 2023-2024-1 《信息安全系统设计与实现(上)》第七周学习笔记
    202113252023-2024-1《信息安全系统设计与实现(上)》第七周学习笔记一、任务要求1.自学教材第4章,提交学习笔记(10分),评分标准如下1.知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)“我在学***X知......
  • 2024年计算机专业微信小程序选题推荐✅(最新、最全、最容易通过的选择)
    (文章目录)前言:heartpulse:博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌:heartpulse:......
  • 从“点击就送”到高攀不起,比亚迪24小时收12万份简历?
    曾几何时,比亚迪校招被网友戏称为“点击就送”,意思是只要投了简历基本都能拿到offer。然而到了2024届秋招,这件事情悄悄发生了变化。比亚迪校园招聘在近几年变得异常火爆,尤其是今年的校招更是吸引了大量学生的关注。10月10日,比亚迪在西安交通大学举办了2024届校园招聘宣讲会,吸引了大......
  • NOIP2023模拟2联测23 T2 害怕
    NOIP2023模拟2联测23T2害怕好像写了一种出题人意料之外的算法。思路在生成树上加入白边,白边和若干条蓝色边形成环,环上的蓝色边必须要分配比该白色边更小的边权(最小生成树)。给每一条边一个分配优先级,优先级的数越小,优先级越高,分配的边权越小。一开始所有边的优先级的数都等......
  • 影驰HOF PRO DDR5-8000 24GB内存评测:延迟不到55ns 游戏最低帧暴涨37%
    一、前言:低延迟低电压的单条24GB内存对于高端玩家来说,现在32GB(16GBx2)内存的确有点拿不出手,而64GB内存(32GBx2)虽然容量够了,但是单条32GB不仅价格昂贵,内存的时序和频率都要做妥协,整体性能与16GB版本相差甚远。相比之下,单条24GB内存能在容量和性能之间获得一个完美的平衡,因此现在越......
  • jz2440-2023-10-25
    1、一般提到分析kernel的启动流程就要从strart.s入手,这是为什么?线索在哪里?因为烧录kernel时会使用到uImage,所以接下来去找uImage是如何生成的,通过源码顶层Makefile可以找到uImage是从vmlinux得到的,还是在该Makefile,可以找到vmlinux依赖于start.s。2、根据uboot的bootargs命令行参......
  • NOIP2023模拟2联测23 C. 负责
    NOIP2023模拟2联测23C.负责目录NOIP2023模拟2联测23C.负责题目大意思路code题目大意给你\(n\)个区间\([l_i,r_i]\),每个区间有个\(w_i\)。如果两个区间有交集(包括端点)那么两个区间就可以连边,形成一个图。现在需要你删除一些区间,使得每个区间大小不超过\(k\)。......
  • RuntimeError: default_program(24): error: extra text after expected end of numbe
    详细报错Traceback(mostrecentcalllast):File"eval_roberta_qa.py",line24,in<module>output=model(input_ids,attention_mask,token_type_ids)File"/home/rzhang/miniconda3/envs/vamc/lib/python3.7/site-packages/torch/nn/mo......