传送门

UPD:之前可能对白色变无色的过程讲的不是很清楚,已经补充


显然在双方绝顶聪明的情况下,黑色不可能赢

首先考虑树上一个白色的点都没有的情况:

1、如果树上有一个点的度数\(\geq 4\),白色必赢,只需要第一次将这一个点染成白色,接着随便染它的两个邻居就可以达成目标

2、如果树上有一个点的度数\(=3\),且它所连的\(3\)个点之间至少有\(2\)个点不是叶子节点,白色必赢,只需要第一次染这一个点,第二次染它的一个非叶子邻居,第三次就一定至少存在一个未被染色的点与这两个相邻。

那么剩下的情况,树的形态只会是下图中的三种

但是还没完(我以为到这里就完了结果WA2被Tutorial点名)

最重要的3、如果树的形态是上面的图中最下面的那一种,而且总点数为奇数,那么白色必赢

图长下面这样,中间的……省略的是一条链,编号从左往右递增。

白色最开始染\(2\)号点,黑色如果染\(3\)号点白色直接染\(1\)号点,所以黑色必须染\(1\)号点。此时白色染\(4\)号点,黑色又只能染\(3\)号点……如是白色染到\(2N\)号点,黑色染\(2N-1\)号点之后,白色染\(2N+1\)号点,那么最右边就会有两个未被染的点,白色就赢了

其余的情况显然都是Draw的

然后考虑已经被染成白色的点的影响,最开始天真的我想直接各种特判过掉,结果WA14不晓得怎么回事

我们已经考虑了树上没有被染成白色的点的所有情况,那么能否将一个已经被染成白色的点等价为若干未被染成白色的点?实际上是可以的

假设下图中\(1\)号点在原树上是一个白色点,那就在保留它原来的邻居的基础上给它额外连上\(3\)个点,连成下面的\(ABCD\)结构

原图\(1\)号点对应新图的\(A\)号点,原图上\(1\)号点跟哪些点连了边,新图上\(A\)号点也和它们连边,然后在下面挂上\(BCD\)三个点

对于执白色的人来说,如果TA在某一回合涂白了\(A\)号点,这个时候如果执黑色者不涂黑\(B\)号点,那么执白色者将会在下一回合涂白\(B\)号点,对于\(CD\)两个点,白色就一定可以涂白其中一个,白色就赢了

所以执黑色者只能涂黑\(B\)号点。而这个时候\(BCD\)三个点对于胜负已经没有影响了,可以直接砍掉这三个点,就相当于白色直接涂白了\(A\)号点,也就是涂白了原图的\(1\)号点,然后又来到白色的回合。

#include<bits/stdc++.h>
//This code is written by Itst
using namespace std;inline int read(){int a = 0;char c = getchar();bool f = 0;while(!isdigit(c)){if(c == '-')f = 1;c = getchar();}while(isdigit(c)){a = (a << 3) + (a << 1) + (c ^ '0');c = getchar();}return f ? -a : a;
}const int MAXN = 1e6 + 9;
struct Edge{int end , upEd;
}Ed[MAXN << 1];
int head[MAXN] , in[MAXN] , N , cntEd , cnt;
char s[MAXN];inline void addEd(int a , int b){Ed[++cntEd].end = b;Ed[cntEd].upEd = head[a];head[a] = cntEd;++in[a];
}int main(){for(int T = read() ; T ; --T){N = read();cntEd = 0;memset(head , 0 , sizeof(int) * (N + 1));memset(in , 0 , sizeof(int) * (N + 1));for(int i = 1 ; i < N ; ++i){int a = read() , b = read();addEd(a , b);addEd(b , a);}scanf("%s" , s + 1);if(N < 3){puts("Draw");continue;}if(N == 3){int cnt = 0;for(int i = 1 ; i <= N ; ++i)cnt += s[i] == 'W';puts(cnt >= 2 ? "White" : "Draw");continue;}bool ifans = 0;int cnt1 = 0;for(int i = 1 ; i <= N ; ++i)if(s[i] == 'W'){addEd(i , ++N);head[N] = 0;addEd(N , i);in[N] = 3;}for(int i = 1 ; !ifans && i <= N ; ++i)if(in[i] > 3)ifans = 1;elseif(in[i] == 3){int cnt = 0; for(int j = head[i] ; j ; j = Ed[j].upEd)cnt += in[Ed[j].end] >= 2;ifans = cnt >= 2;++cnt1;}if(cnt1 == 2 && (N & 1))ifans = 1;puts(ifans ? "White" : "Draw");}return 0;
}

转载于:https://www.cnblogs.com/Itst/p/10356243.html

CF1110G Tree-Tac-Toe 博弈论、构造相关推荐

  1. Principle of Computing (Python)学习笔记(7) DFS Search + Tic Tac Toe use MiniMax Stratedy

    1. Trees Tree is a recursive structure. 1.1 math nodes https://class.coursera.org/principlescomputin ...

  2. python二维游戏示例_Python实现的井字棋(Tic Tac Toe)游戏示例

    本文实例讲述了Python实现的井字棋(Tic Tac Toe)游戏.分享给大家供大家参考,具体如下: 说明 用python实现了井字棋,整个框架是本人自己构思的,自认为比较满意.另外,90%+的代码 ...

  3. python游戏代码运行不了_无法使我的tic tac toe游戏在python中正确运行

    转不到"玩家1"的原因是你的支票中缺少一个空格.你也没有正确地检查一个玩家何时获胜,这就是为什么你会有这种奇怪的行为.你需要检查每个位置,而不仅仅是最后一个.我还添加了对用户输入的 ...

  4. react中使用构建缓存_通过在React中构建Tic Tac Toe来学习ReasonML

    react中使用构建缓存 3. 7. 2018: UPDATED to ReasonReact v0.4.2 3. 7. 2018:更新为ReasonReact v0.4.2 You may have ...

  5. amazon.设计1. tic tac toe

    //不觉中 已经全力找工作好久好久了.大概有1年半了.身心疲惫,不要放弃.曙光快来了. 1.tic tac toe //http://www.ntu.edu.sg/home/ehchua/progra ...

  6. python井字棋ai,python 井字棋(Tic Tac Toe)

    说明 用python实现了井字棋,整个框架是本人自己构思的,自认为比较满意.另外,90%+的代码也是本人逐字逐句敲的. minimax算法还没完全理解,所以参考了这里的代码,并作了修改. 特点 可以选 ...

  7. python井字棋游戏代码_Python实现的井字棋(Tic Tac Toe)游戏示例

    Python实现的井字棋(Tic Tac Toe)游戏示例 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  Python实现的井字棋(Tic Tac Toe)游戏示 ...

  8. C++ 很有趣:编写一个井字游戏 (Tic Tac Toe)

    英文原文:C++ is fun: Writing a Tic Tac Toe Game 这个有趣的C++系列打算展示一下使用C++写代码可以和其他主流语言一样高效而有趣.在第二部分,我将向你展示使用C ...

  9. 圈叉游戏 java_【炫光圈叉棋】炫光圈叉棋 Tic Tac Toe Glow 1.8.1下载_安卓(android)软件下载-魅族溜...

    一款炫光风格的圈叉棋游戏,支持单/双人模式.圈叉棋,英文:tic-tac-toe,别名:圈叉游戏.是一种游戏,3*3的9个方格子,先下者画圈,后下者画叉,每人可以在任意没有对方棋子的封闭方格里下一次, ...

  10. CF1120D Power Tree(树形DP/构造+差分+最小生成树)

    解法一:树形DP 个人觉得这个方法是比较可能想到的,但是输出方案很恶心 先转换题意:"无论怎样规定叶子的初始点权,都可以通过操作你选择的点来让所有叶子的点权清空"意味着每个叶子节点 ...

最新文章

  1. 存储过程内建临时表和临时函数,合并一个由存储过程返回的表
  2. 投稿 | “轻量应用服务器”征文活动正式启动
  3. Oracle 数据库启动 startup和startup force的区别
  4. flink的datastream输出没有结果
  5. SAP Hybris使用recipe进行安装时,是如何执行ant命令的?
  6. HTTP标准相关的基础概念
  7. Spring @Lazy批注用例
  8. angular字符串转成html,详解angular如何调用HTML字符串的方法
  9. linux时间跳变影响,MONGO 集群 修改linux主机时间后的影响
  10. ipad怎么连接电脑_一条网线怎么连接多台电脑?
  11. 关于Linux的close函数的注意点
  12. 数据结构 统计二叉树中度为0,1和2的结点个数
  13. Rust : 红楼梦一书中文字符的统计
  14. camvid数据集使用方法_github资源推荐:目标姿态检测数据集与渲染方法
  15. Java生成桌面快捷方式(字节流生成)
  16. 轻松易懂的CSS学习权威指南来了
  17. spark Hash Shuffle内幕彻底解密
  18. bailian.openjudge 2712:细菌繁殖
  19. 一种将海康大华宇视等安防摄像机发布到H5网页微信进行直播的全终端无插件播放技术方案
  20. 【shell】scp 同时向多个主机拷贝数据

热门文章

  1. java jdbc_详解Java基础知识——JDBC
  2. linux中哪个命令可以压缩部分文件,可以使用Linux解压缩命令,解压缩任意格式的压缩文件。...
  3. android span的用法,android – 如何使用TextAppearanceSpan
  4. C++ 最大堆最小堆与push_heap pop_heap
  5. 为什么C++构造函数不能是虚函数
  6. OpenGL基础5:第一个正方形
  7. Unity3D基础37:Input控制面板
  8. Wannafly挑战赛27: E. 黄魔法师(构造)
  9. MATLAB 中 floor、round、ceil、fix 取整函数的意义和区别
  10. pytorch 中 torch.cat 函数的使用