一个平面上有n个点(一个凸多边形的顶点),每次可以连接一个平面上的两个点(不能和已经连接的边相交),如果平面上已经出现了一个三角形,则不能在这个平面上继续连接边了。

现在总共有N个平面,每个平面上都有若干点。(就是有N个相同的游戏同时进行了)。

想法很单纯,就是计算出每一个平面上游戏的sg函数值,然后求Nim和就哦了。

sg函数暴力求法:

一个平面上连接点时,不能连接已经有边的顶点,因为对方只需要再连接一次就可以组成一个三角形了。又所有的边不能相交,因此每连接一条边,就相当于把整个平面上的点划分成了两个部分,在接下来的游戏中,只能单独在两部分里面进行,相当于将一个游戏划分成了两个游戏。因此当前状态x的sg函数值就是两个子游戏的Nim和了。

即:sg(x) = mex{ sg(i)^sg(x-i-2) }

这样复杂度很高。但是这道题目有规律,在大数据的范围下,会出现循环,循环长度为34,因此只需要小数据暴力,大数据打表就哦了。

#include <cstdio>
#include <cstring>
typedef long long ll;
#define N 1002
bool vis[N];
int sg[N];
int a[] = {4,8,1,1,2,0,3,1,1,0,3,3,2,2,4,4,5,5,9,3,3,0,1,1,3,0,2,1,1,0,4,5,3,7};
int SG(int x) {
if (sg[x] != -1) return sg[x];
if (x == 0) return 0;
if (x == 1) return 0;
if (x == 2) return 1;
if (x == 3) return 1;
memset(vis, false, sizeof(vis));
for (int i=0; i<x-1; i++) vis[SG(i)^SG(x-i-2)] = true;
for (int i=0; ;i++) if (!vis[i]) return i;
}
int get_sg(int x) {
if (x <= 100) return sg[x];
return a[x%34];
}
int main() {
memset(sg, -1, sizeof(sg));
for (int i=0; i<=100; i++) sg[i] = SG(i); int T, n, x; scanf("%d", &T);
while (T--) {
scanf("%d", &n);
int ans = 0;
while (n--) { scanf("%d", &x); ans ^= get_sg(x); }
puts(ans ? "Carol" : "Dave");
}
return 0;
}

HDU 4664 Triangulation【博弈论】的更多相关文章

  1. hdu 4664 Triangulation 博弈论

    看到这题时,当时还不会做,也没搞懂sg函数,于是狠狠的钻研了下博弈论,渐渐的知道了sg函数…… 现在在来做这题就很容易了,1A 打表容易发现在80左右的时候就出现循环节了 代码如下: #include ...

  2. HDU 4664 Triangulation(SG函数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4664 题意:给出一个n个点的凸包(不存在三点共线).每次可以选择两个点连线,但是任意两条线只能在顶点处 ...

  3. HDU 4664 Triangulation(2013多校6 1010题,博弈)

    Triangulation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  4. hdu 4664 Triangulation(题意已在讨论版中说明)

    题意: 给定n个平面(平面之间相互独立),每个平面上有一些点,并且构成凸集,C和D轮流选一个平面连接两个点画线段,并保证线段之间除了端点之外没有其它交点,当平面上出现一个完整的三角形之后此平面就不能继 ...

  5. HDU 5512 Meeting 博弈论

    Meeting Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5512 ...

  6. hdu 4678 Mine 博弈论

    这是一题简单的博弈论!! 所有的空白+边界的数字(个数为n)为一堆,容易推出其SG函数值为n%2+1: 其他所有的数字(个数为m)的SG值为m%2. 再就是用dfs将空白部分搜一下即可!(注意细节) ...

  7. hdu 4023 Game 博弈论

    思路: 将15种分成5类: 1.1和2为一类: 2.3,4,5,6为一类: 3.7,8,9,10为一类: 4.11,12,13,14,15为一类: 5.15为一类. 比较各类的优先级,就会发现放置的顺 ...

  8. hdu 4701 Game 博弈论

    思路: ▶ 设 win(i,x,y) 表示当前可以买的物品是 i,先手有 x 元,后 手有 y 元时,先手是否必胜 ▶ win(i,x,y) ⇐⇒∃j((j > i)∧(x ≥ si−sj)∧¬ ...

  9. hdu 3389 Game 博弈论

    思路: 其本质为阶梯博弈; 阶梯博弈:博弈在一列阶梯上进行,每个阶梯上放着自然数个点,两个人进行阶梯博弈...     每一步则是将一个集体上的若干个点( >=1 )移到前面去,最后没有点可以移 ...

随机推荐

  1. DataTables warning 错误警告

    今天使用 Charisma 框架的 jquery datatable 插件时出现如下错误: 搜索才发现 DataTables 目前不支持有单元格合并的表格.而且只要单元格数目不同就会有错误,不能使用搜 ...

  2. Delphi之TDrawGrid绘制

    一直都对QQ的好友列表很好奇,最先感觉用TreeView实现的,看了看TreeView的源码,发现要实现还真的不太好完成任务啊,其中最大的原因是自己的功力不足,后来觉得用ListView来做吧,结果也 ...

  3. linux 进程(一)---基本概念

    一.进程的定义         进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放.可以认为进程是一个程序的一次执行过程.   二.进 ...

  4. 【Daily】 2014-4-23

    KEEP GOING Think more product when face difference Check value null when insert/remove/update/add ch ...

  5. Tkinter类之窗口部件类

    Tkinter类之窗口部件类 Tkinter支持15个核心的窗口部件,这个15个核心窗口部件类列表如下:窗口部件及说明:Button:一个简单的按钮,用来执行一个命令或别的操作.Canvas:组织图形 ...

  6. magento中取不同store中的产品数据

    $products = Mage::getResourceModel('catalog/product_collection')                    ->setStoreId( ...

  7. ios常用的框架(源自知乎上的回答)

    首先,学习这类开源项目的主要目的是为了实现产品汪需求,如果不是这个目的,完全可以看Explore GitHub,当前最火的开源项目都在这里,当然你需要过滤一下语言. 好了,介绍几个希望能帮助到你. 普 ...

  8. VB.NET的反射机制

    1.前提 Net的应用程序由几个部分:‘程序集’.‘模块’.‘类型’组成. 装配件是.Net应用程序执行的最小单位,编译出来的.dll..exe都是装配件. 2.概念 反射是获得运行时类型的方式. 概 ...

  9. BaseAdapter 注意的关键点!

    BaseAdapter  我们一般就是继承然后重写自定义,然后listview  set进去即可!  数据改变的时候,我们习惯这样: public void update(List list) {   ...

  10. 重写系统中的UINavigationController 返回按钮的事件

    .扩展UIviewController UIViewController+BackButtonHandler.h #import <UIKit/UIKit.h> @protocol Bac ...