首页 > 其他分享 >hdu3980 Paint Chain SG函数+SG定理+记忆化搜索

hdu3980 Paint Chain SG函数+SG定理+记忆化搜索

时间:2023-03-30 20:35:50浏览次数:54  
标签:游戏 Chain int sg 定理 Paint SG 函数

liyishui今天学习博弈,因为liyishui今天写树链剖分写得有点理智--

题意:

有一个圆,上面有n个豆子,每次要挑出连续m个没染色的豆子进行染色,不能移动时输掉游戏

问先手必胜还是后手必胜,其中n、m<=1000

题解:

会很朴素地想到如果第一个人拿走了m个,那么剩下的就是一条链的问题。

所以可以先n-m,然后交换一下前后手。(当然如果n<m是要讨论一下的)

然后再继续想,如果此时的先手选了一段走,剩下的是什么情况?

就变成左边一段(可能为空),右边一段(可能也为空)

接下来轮到的人可以操作左边,也可以操作右边

你发现这样等价于有两个游戏——这让我们想到了sg定理:

多线程游戏SG值为子游戏SG值的异或和

所以我们可以枚举当前先手选取了哪段进行切分(有一点区间dp的感觉)

显然不同的分段点对应不同的状态,dfs求出左、右边部分的sg值,异或一下就得到该后继状态的sg值

int vis[N]={0};
    for(int i=1;i<=l-m+1;i++){
        vis[dfs(i-1)^dfs(l-(i+m-1))]=1;
    }

然后再根据sg函数的定义,扫一遍求出哪个是mex,返回即可

for(int i=0;i<N;i++){
        if(!vis[i]){
            //sg[l]=i;
            //cout<<l<<" "<<sg[l]<<endl;
            return sg[l]=i;
        }
    }

感觉思路还是很清晰的,主要考察了sg函数的基本应用

#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int n,m,sg[N];
int dfs(int l){
    if(!l) return sg[l]=0;
    if(l<m) return sg[l]=0;
    if(sg[l]!=-1) return sg[l];
    int vis[N]={0};
    for(int i=1;i<=l-m+1;i++){
        vis[dfs(i-1)^dfs(l-(i+m-1))]=1;
    }
    for(int i=0;i<N;i++){
        if(!vis[i]){
            //sg[l]=i;
            //cout<<l<<" "<<sg[l]<<endl;
            return sg[l]=i;
        }
    }
    return 0; 
}
int main(){
    //freopen("lys.in","r",stdin);
    int t,cas=0;
    cin>>t;
    while(t--){
        cin>>n>>m;
        memset(sg,-1,sizeof(sg));
        cas++;
        if(n<m){
            cout<<"Case #"<<cas<<": abcdxyzk"<<endl;
            continue;
        }
        n-=m;
        int tmp=dfs(n);
        if(sg[n]) cout<<"Case #"<<cas<<": abcdxyzk"<<endl;
        else cout<<"Case #"<<cas<<": aekdycoin"<<endl;
    }
}

 

标签:游戏,Chain,int,sg,定理,Paint,SG,函数
From: https://www.cnblogs.com/liyishui2003/p/17274196.html

相关文章

  • MsgId 这里是放需要的功能逻辑(与服务器放一起并且客户端也得一致)
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceFWQ1{classMsgId{publ......
  • FastCGI server uwsgi server SCGI server memcached server
     NGINXReverseProxy|NGINXPlushttps://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/fastcgi_pass passesarequesttoaFastCGIserveruwsg......
  • python+playwright 学习-39.登录页面滑动解锁(ActionChains)
    前言登录页面会遇到滑块解锁,滑动解锁的目的就是为了防止别人用代码登录(也就是为了防止你自动化登录),有些滑动解锁是需要去拼图这种会难一点。有些直接拖到最最右侧就可以......
  • osg三维渲染引擎设计与实践 - 王锐(2009)
    《OpenSceneGraph三维渲染引擎设计与实践》的编写目的是:详细剖析OpenSceneGraph引擎的实现流程,包括其场景图形结构,几何体绘制和渲染状态的封装机制,场景漫游、交互和动画的......
  • CSG1140 -- 括号序列
    括号序列分析:线段树维护区间(与)的差值:首先若两个位置是相同字符,不会改变匹配形式,直接YES;若选择)(改变,因为原本是合法的,这样交换过后总是能再次匹配;若选择()改变......
  • dmesg 只输出部分内容 。
    问题: 我在系统启动之后,想要通过demsg 看一下声卡的信息,但是只是输出了部分的内容。只有关于文件系统的内容,没有内核的内容。 过程: 我在网上找到的资料: ......
  • Centos 7 - uWSGI服务器 虚拟环境配置详解及
    @目录1.系统环境2.uWSGI安装3.虚拟环境配置3.1创建虚拟环境3.2启动虚拟环境虚拟环境内安装uwsgi4.uwsgi.ini配置模板5.uWSGI服务器无法识别虚拟环境内的python解释......
  • Centos + Django + Nginx + uwsgi 部署项目-rpm包安装 Mysql 5
    笔者发觉下面这个方法可能有些缺陷,适合自己的就看下,如果是新开的虚拟机有可能不适用下面的方法,云服务器开的LinuxCentos系统应该可以。虚拟机安装Mysql的具体方法,可以看......
  • SG90舵机的原理和控制方式
    前言做过机器人、智能车或者玩航模的朋友应该对舵机不会陌生,这种舵机也是很常用的。舵机只是我们通俗的叫法,它的本质是一个伺服电机,也可以叫做位置(角度)伺服驱动器。一般被......
  • CF1572C Paint
    CF1572CPaint一看感觉很有dp的感觉。所以就来吧。设\(f_{l,r,c}\)表示区间\([l,r]\)选了颜色\(c\)的答案,先不管怎么转移。状态太巨大,有种猜结论的冲动:若只保留......