hdu 4664 Triangulation(题意已在讨论版中说明)
题意:
给定n个平面(平面之间相互独立),每个平面上有一些点,并且构成凸集,C和D轮流选一个平面连接两个点画线段,并保证线段之间除了端点之外没有其它交点,当平面上出现一个完整的三角形之后此平面就不能继续画线。最早无法画线的人输。输出赢的人。
解法:
因为n个平面是独立的,所以sg函数满足异或的关系。对于每一个平面,求sg值。对于n个点,连上一条线可以分成 i 和 n-2-i 两个独立的部分。所以该点的子状态为sg[i]^sg[n-i-2](0<=i<=n-2)。然后可以计算该点的sg值。打表发现n>68之后会出现长度为34的循环,所以打个34×3的表就可以了。sg函数是个好东西啊!
递归搜索求SG函数:
#include<stdio.h>
#include<string.h>
#define N 1000
int sg[N];
int GetSG(int k)
{
if(sg[k]!=-)return sg[k];
bool mex[N]={};
for(int i = ; i <= k-; i++)
{
sg[i] = GetSG(i);
sg[k-i-] = GetSG(k-i-);
mex[sg[i]^sg[k-i-]]=;
}
int i=;
while(mex[i])i++;
return sg[k]=i;
}
int main()
{
int i,j;
int t,n,x,ans;
memset(sg,-,sizeof(sg));
GetSG();
scanf("%d",&t);
while(t--)
{
ans=;
scanf("%d",&n);
for(i=;i<n;i++)
{
scanf("%d",&x);
if(x>)ans^=sg[(x-)%+];
else ans^=sg[x];
}
if(ans)printf("Carol\n");
else printf("Dave\n");
}
return ;
}
循环求SG
#include<stdio.h>
#include<string.h>
#define N 1000
int sg[N];
int hash[N];
void GetSG(int n)
{
int i,j,k;
sg[]=;
sg[]=;
for(i=;i<=n;i++)
{
memset(hash,,sizeof(hash));
for(j=;i>=+j&&j<=i/;j++)
hash[sg[j]^sg[i--j]]=;
for(j=;j<=n;j++)
{
if(!hash[j])
{
sg[i]=j;
break;
}
}
}
}
int main()
{
int i,j;
int t,n,x,ans;
GetSG();//改成GetSG(90);就WA了,奇葩错误啊
/*
GetSG(200);
for(i=0;i<=200;i++)
{
printf("%d ",sg[i]);
if(i>=52&&(i-52)%34==0)printf("\n");//if(i==52)printf("\n");
}*/
scanf("%d",&t);
while(t--)
{
ans=;
scanf("%d",&n);
for(i=;i<n;i++)
{
scanf("%d",&x);
if(x>)ans^=sg[(x-)%+];
else ans^=sg[x];
/*if(x<86) ans^=sg[x];
else ans^=sg[x%34+68];*/ }
if(ans)printf("Carol\n");
else printf("Dave\n");
}
return ;
}
hdu 4664 Triangulation(题意已在讨论版中说明)的更多相关文章
- HDU 4664 Triangulation(SG函数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4664 题意:给出一个n个点的凸包(不存在三点共线).每次可以选择两个点连线,但是任意两条线只能在顶点处 ...
- HDU 4664 Triangulation(2013多校6 1010题,博弈)
Triangulation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- hdu 4664 Triangulation 博弈论
看到这题时,当时还不会做,也没搞懂sg函数,于是狠狠的钻研了下博弈论,渐渐的知道了sg函数…… 现在在来做这题就很容易了,1A 打表容易发现在80左右的时候就出现循环节了 代码如下: #include ...
- HDU 4664 Triangulation【博弈论】
一个平面上有n个点(一个凸多边形的顶点),每次可以连接一个平面上的两个点(不能和已经连接的边相交),如果平面上已经出现了一个三角形,则不能在这个平面上继续连接边了. 现在总共有N个平面,每个平面上都有 ...
- SharePoint REST 服务获取讨论版问题
前言 最近,有这么个需求,需要获取讨论版里的问题,然后汇总,这里就考虑用REST服务了. 1.我们先创建这么一个讨论版列表,然后添加一些问题,如下图: 2.然后需要开发REST服务代码了,如下图: 3 ...
- 使用IDEA运行项目时提示:Warning:java: 源值1.5已过时, 将在未来所有发行版中删除
如图 在使用IDEA运行项目时,在下方提示:Warning:java: 源值1.5已过时, 将在未来所有发行版中删除 这是因为JDK版本问题 解决方法如下:左上角 file ——> Projec ...
- 《深入理解Java虚拟机》第2版挖的坑终于在第3版中被R大填平了
这是why技术的第34篇原创文章 本周还是在家办公的一周,上面的图就是我在家的工位,和上周<Dubbo Cluster集群那点你不知道的事>这篇文章里面的第一张图片比起来,升级了显示器支撑 ...
- 动态链接库中分配内存引起的问题-- windows已在XX.exe中触发一个断点
动态链接库中分配内存引起的 本文主要是探讨关于在动态链接库分配的内存在主程序中释放所产生的问题,该问题是我在刚做的PJP工程中所遇到的,由于刚碰到之时感动比较诡异(这也是学识不够所致),所以将它写下来 ...
- Windows 10 开发人员预览版中的新增功能(转自 IT之家)
Windows 10 开发人员预览版中的新增功能 在Win10预览版中安装工具与SDK后,即可着手创建Windows通用应用或先浏览目前的环境与此前相比都发生了什么变化. 应用建模 文件资源管理器: ...
随机推荐
- 在HTML中添加目录
<a href="#num1">跳转到第一章</a><div id="num1">第一章</div>用a的hre ...
- 硬件相关-ADC原理(未完成)
一.模数转换的一般步骤: 1)采样和保持 为了把模拟信号转换成对应的数字信号,必须首先将模拟量每隔一定时间抽取一次样值,使时间上连续变化的模拟量变为一个时间上断续变化的模拟量,这个过程称为采样. 为了 ...
- 带搜索框的下拉框chosen.jQury.js
下载所需js,css png资源 <link href="chosen.css" rel="stylesheet" type="text ...
- pspo
一.项目计划总结: 周活动总结表 姓名: 日期:3.12.2015 日期 任务 听课 编写程序 阅读课本 准备考试 日总计 周日 周一 周二 周三 10:00- ...
- C语言编写的随机产生四则运算测试题
题目:编写一个四则运算测试题的程序,要求每道题都要随机产生 解题思路: 1.编写测试题,且为30道,就要用到循环函数,因此想到用for()函数 2.随机产生两个数,就想到用rand()函数. 注:1. ...
- C#开源系统大汇总(转)
一.AOP框架 Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种 ...
- android 通过socket获取IP
如题<android 通过socket获取IP>: socket.getInetAddress().getHostAddress();
- Dynamic Programming - Part1
public static void main(String[] args) { //give N, find the number of different ways to write N as t ...
- 关于High-Resolution Timer(了解)
如果一个系统包含高精度性能计数器(HRPC,high-resolution performance counter)则此系统提供高精度定时器.你可以使用API函数QueryPerformanceFre ...
- mongo 1067错误
对mongo进行错误的操作导致mongo服务异常关闭,当重启mongo服务时出现1067错误此时在data目录下产生mongod.lock文件,可以讲此文件删除,然后重启就可以了 Please mak ...