bzoj 2927: [Poi1999]多边形之战 博弈论

来源:互联网 发布:淘宝中老年装 编辑:程序博客网 时间:2024/05/29 19:56

题意

多边形之战是一个双人游戏。游戏在一个有n个顶点的凸多边形上进行,这个凸多边形的n-3条对角线将多边形分成n-2个三角形,这n-3条对角线在多边形的顶点相交。三角形中的一个被染成黑色,其余是白色。双方轮流进行游戏,当轮到一方时,他必须沿着画好的对角线,从多边形上切下一个三角形。切下黑色三角形的一方获胜。
注:如果连接一个多边形中任意两点的线段都完全包含于这个多边形,则称这个多边形为凸多边形。
求解任务:
请设计一个程序:
·读入对一个多边形的描述。
·确定先走的一方是否能够获胜。
·将结果输出。
4 <= n <= 50000

分析

首先如果黑三角形能直接切下来的话就先手必胜。否则的话,我们在相邻的两个三角形之间连一条边,就得到了一棵树。假设我们以1为根,那么每次操作就相当于只能删掉一个叶节点。而结束状态必然是全图只剩下1和1的一个儿子。那么操作数必然是已经确定了的,也就是只跟n的奇偶性有关,那么就可以直接得到结果了。

代码

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;int main(){    int n;    scanf("%d",&n);    int a[3];    scanf("%d%d%d",&a[0],&a[1],&a[2]);    sort(a+1,a+3);    int s=0;    if (a[0]+1==a[1]) s++;    if (a[1]+1==a[2]) s++;    if ((a[2]+1)%n==a[0]) s++;    if (s==2||n%2==0) puts("TAK");    else puts("NIE");    return 0;}