题目:https://www.luogu.org/problemnew/show/P2575

第一次用SG函数解决问题,有许多不熟练的地方;

试图按自己的理解写一个dfs,结果错了(连题都没读对,以为是像跳棋一样跳),这样的话用dfs从左往右推就不行了呢;

附上自己的错误尝试:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int maxn=;
int T,n,p,ans,g[];
int dfs(int x)
{
if(g[x])return g[x]-;
int ret=;
for(int i=;i>=;i--)
if(x&(<<i))
{
if((x&(<<(i-)))&&(x&(<<(i-)))==&&i->=)
{
int k=x-(<<i)+(<<(i-));
// if(!dfs(k))
// {
// g[x]=2;
// return 1;
// }
ret^=dfs(k);
}
if((x&(<<(i-)))==&&i->=)
{
int k=x-(<<i)+(<<(i-));
// if(!dfs(k))
// {
// g[x]=2;
// return 1;
// }
ret^=dfs(k);
}
} if(!ret)g[x]=;
else g[x]=;
// printf("%d %d\n",x,g[x]-1);
return g[x]-;
}
int main()
{
scanf("%d",&T);
while(T--)
{
memset(g,,sizeof g);
ans=;
scanf("%d",&n);
for(int i=,m;i<=n;i++)
{
p=;
scanf("%d",&m);
for(int j=,x;j<=m;j++)
{
scanf("%d",&x);
x--;
p|=(<<(-x));
}
// if(ans)continue;
// if(dfs(p)==0)ans=1;
ans^=dfs(p);
}
if(ans)printf("YES\n");
else printf("NO\n");
}
return ;
}

下面是正解,也就是个SG函数的模板;

状压一下每一行,先预处理出来所有状态的SG函数值(注意vis[里面是SG函数值]),然后每次询问异或一下就可以了,还挺简明的。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int T,n,m,ans,sg[<<];
bool vis[];
void init(int x)
{
memset(vis,,sizeof vis);
int w=;
for(int i=;i<=;i++)//从小到大对应从右往左
{
int t=(<<(i-));
if(x&t)
{
if(i>&&(x&(t>>))==)
vis[sg[x-t+(t>>)]]=;
// if(i>2&&(x&(t>>1))&&(x&(t>>2))==0)
// vis[sg[x-t+(t>>2)]]=1;//读错题
if((x&(t>>))&&w)
vis[sg[x-t+(<<(w-))]]=;
}
else w=i;
}
int k=;//求mex
while(vis[k])k++;
sg[x]=k;
}
int main()
{
scanf("%d",&T);
for(int i=;i<=(<<)-;i++)init(i);
while(T--)
{
ans=;//!
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&m);
int p=;
for(int j=,x;j<=m;j++)
{
scanf("%d",&x);
p|=(<<(-x));
}
ans^=sg[p];
}
if(ans)printf("YES\n");
else printf("NO\n");
}
return ;
}

洛谷P2575高手过招——SG函数初试的更多相关文章

  1. 洛谷 [P2575] 高手过招

    SG函数+状压记忆化搜索 观察题目发现,每一行都是独立的,只要处理出来每一行的SG值,异或起来就好 每一行的SG值可以用状压+记忆化搜索的方法来求,对位运算技术是个很大的考验 注意SG值要预处理出来, ...

  2. Luogu 2575 高手过招-SG函数

    Solution SG函数跑一遍就过了ouo Code #include<cstring> #include<cstdio> #include<algorithm> ...

  3. 洛谷P1294 高手去散步

    洛谷1294 高手去散步 题目背景 高手最近谈恋爱了.不过是单相思.“即使是单相思,也是完整的爱情”,高手从未放弃对它的追求.今天,这个阳光明媚的早晨,太阳从西边缓缓升起.于是它找到高手,希望在晨读开 ...

  4. 洛谷P2568 GCD (欧拉函数/莫比乌斯反演)

    P2568 GCD 题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 输入输出格式 输入格式: 一个整数N 输出格式: 答案 输入输出样例 输入 ...

  5. P2575 高手过招

    传送门 直接搞好像搞不了 考虑转换模型 显然每一行棋子不会跑到其他行.. 所以可以把每一行的情况看成一个子博弈 显然整个答案就是每一行的SG值的异或和 不懂的回去学SG函数... 考虑怎么分析一行的状 ...

  6. 题解-洛谷P1184 高手之在一起

    https://www.luogu.org/problemnew/show/P1184 (题目出处) 见到地名,自然就想到字符串了.可以从第一天开始,将她的位置与高手方便取得地方一一比较,(char字 ...

  7. Luogu P2575 高手过招

    题目链接 \(Click\) \(Here\) 关键在于转换成阶梯\(Nim\)的模型.最开始把题目看错了,理解正确后发现棋子可以向后跳不止一位,那么就比较简单了. 这里把空格看做阶梯,棋子看做硬币, ...

  8. 洛谷 P1184高手之在一起 题解

    题目传送门 那位高手是谁啊?@jxpxcsh  QWQ. 这道题数据特别水,所以直接使用O(n*m),每读进一个m内的字符串,就扫一遍n的字符串.但注意地点字符串中有可能会有空格,所以这时候就要请出g ...

  9. 洛谷——P1294 高手去散步

    P1294 高手去散步 题目背景 高手最近谈恋爱了.不过是单相思.“即使是单相思,也是完整的爱情”,高手从未放弃对它的追求.今天,这个阳光明媚的早晨,太阳从西边缓缓升起.于是它找到高手,希望在晨读开始 ...

随机推荐

  1. 洛谷—— P1051 谁拿了最多奖学金

    https://www.luogu.org/problem/show?pid=1051 题目描述 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同: 1) 院士奖 ...

  2. bzoj2555(lct维护sam)

    题意: (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 字符串长度<=6e5,询问总长度<=3e6 分析: 考虑建个sam,然后把 ...

  3. python type

    基于2.7 版本 type 是内置函数,有两种用法 class type(object) With one argument, return the type of an object. The re ...

  4. Python 基础教程之包和类的用法

    Python 基础教程之包和类的用法 建立一个文件夹filePackage 在filePackage 文件夹内创建 __init__.py 有了 __init__.py ,filePackage才算是 ...

  5. evaluate-reverse-polish-notation——栈

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are+,-,*, ...

  6. Oracle创建JOB定时任务

    --- DECLARE JOB NUMBER;BEGIN      DBMS_JOB.SUBMIT(          JOB=>JOB,          WHAT=>'CTABLE_T ...

  7. HDU 1248 寒冰王座 (水题的N种做法!)(含完全背包)

    寒冰王座 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  8. nginx-伤心的事

    今天测试接口,总是出问题,测试了两天,整个流程就卡在最后一步. 每次采用curl,request等请求访问我的服务器都会返回403状态码,网上找了很多资料 有权限的,有静态文件的,然而很多都没有什么卵 ...

  9. hdoj 4932 Miaomiao&#39;s Geometry 【暴力枚举】

    题意:在一条直线上有n个点.取一长度差为x的区间. 规定点必须是区间的端点. 让你找出来最大的x 策略:rt 分析可得:两个相邻点之间的区间要么是两个点的差,要么就是两个点的差的一半,那我们就简单枚举 ...

  10. STL--map用法

    STL--map用法map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力由于这个特性它完成有可能在我们处理 ...