hdu4664 Triangulation 多校第六场

来源:互联网 发布:vb中str是什么意思 编辑:程序博客网 时间:2024/05/15 04:27
其实这题看懂了就很好搞了。
 
每次加边,不能形成三角形,所以肯定不加共点的边,否则就是自杀。
 
x个点,转移后相当于 i    ,    x-i-2 .加的那两个点去掉了。
 
 
SG函数打表以后,很明显是要找规律。
发现周期是34.
而且周期要到后面才有周期。
 
所以前面打表,后面利用周期。
 
可以参考下oeis,发现这个是经典的问题。Sprague-Grundy values for Dawson's Chess
点击打开链接

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define clr(a, x) memset(a, x, sizeof(a))const int MAXN = 100010;int sg[121];bool vis[121];int mex(int x){    if(sg[x]!=-1)return sg[x];    if(x == 0||x == 1)return sg[x] = 0;    if(x == 2||x == 3)return sg[x] = 1;    clr(vis,0);    for(int i = 0;i < x-1;i++)        vis[mex(i)^mex(x-i-2)] = 1;    for(int i = 0;;i++)        if(!vis[i]) return sg[x] = i;}int SG(int x){    if(x <= 120) return sg[x];    x=x%34+2*34;    return sg[x];}int main(){    clr(sg,-1);    for(int i = 0;i <= 120;i++)        sg[i] = mex(i);    int T,n,a;    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        int sum = 0;        for(int i = 0;i < n;i++)        scanf("%d",&a),sum ^= SG(a);        if(sum) puts("Carol");        else puts("Dave");    }    return 0;}


原创粉丝点击