洛谷P2575高手过招——SG函数初试
题目: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函数初试的更多相关文章
- 洛谷 [P2575] 高手过招
SG函数+状压记忆化搜索 观察题目发现,每一行都是独立的,只要处理出来每一行的SG值,异或起来就好 每一行的SG值可以用状压+记忆化搜索的方法来求,对位运算技术是个很大的考验 注意SG值要预处理出来, ...
- Luogu 2575 高手过招-SG函数
Solution SG函数跑一遍就过了ouo Code #include<cstring> #include<cstdio> #include<algorithm> ...
- 洛谷P1294 高手去散步
洛谷1294 高手去散步 题目背景 高手最近谈恋爱了.不过是单相思.“即使是单相思,也是完整的爱情”,高手从未放弃对它的追求.今天,这个阳光明媚的早晨,太阳从西边缓缓升起.于是它找到高手,希望在晨读开 ...
- 洛谷P2568 GCD (欧拉函数/莫比乌斯反演)
P2568 GCD 题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 输入输出格式 输入格式: 一个整数N 输出格式: 答案 输入输出样例 输入 ...
- P2575 高手过招
传送门 直接搞好像搞不了 考虑转换模型 显然每一行棋子不会跑到其他行.. 所以可以把每一行的情况看成一个子博弈 显然整个答案就是每一行的SG值的异或和 不懂的回去学SG函数... 考虑怎么分析一行的状 ...
- 题解-洛谷P1184 高手之在一起
https://www.luogu.org/problemnew/show/P1184 (题目出处) 见到地名,自然就想到字符串了.可以从第一天开始,将她的位置与高手方便取得地方一一比较,(char字 ...
- Luogu P2575 高手过招
题目链接 \(Click\) \(Here\) 关键在于转换成阶梯\(Nim\)的模型.最开始把题目看错了,理解正确后发现棋子可以向后跳不止一位,那么就比较简单了. 这里把空格看做阶梯,棋子看做硬币, ...
- 洛谷 P1184高手之在一起 题解
题目传送门 那位高手是谁啊?@jxpxcsh QWQ. 这道题数据特别水,所以直接使用O(n*m),每读进一个m内的字符串,就扫一遍n的字符串.但注意地点字符串中有可能会有空格,所以这时候就要请出g ...
- 洛谷——P1294 高手去散步
P1294 高手去散步 题目背景 高手最近谈恋爱了.不过是单相思.“即使是单相思,也是完整的爱情”,高手从未放弃对它的追求.今天,这个阳光明媚的早晨,太阳从西边缓缓升起.于是它找到高手,希望在晨读开始 ...
随机推荐
- 小窥React360——用React创建360全景VR体验
前言 混迹VR届的发烧友兼开发者们一定不要错过这款FaceBook推出的跨端VR开发框架——React360,称为360全景体验框架更为准确,因为其前身是FaceBook和Oculus2017年 ...
- 未能加载文件或程序集“System.EnterpriseServices, Version=4.0.0.0或2.0.0.0
未能加载文件或程序集“System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50 ...
- 【Java TCP/IP Socket】深入剖析socket——数据传输的底层实现
底层数据结构 如果不理解套接字的具体实现所关联的数据结构和底层协议的工作细节,就很难抓住网络编程的精妙之处,对于TCP套接字来说,更是如此.套接字所关联的底层的数据结构集包含了特定Socket实例所关 ...
- android 加一个按钮,退出程序
package com.example.yanlei.yl; import android.graphics.Color; import android.support.v7.app.AppCompa ...
- BUPT复试专题—三元组(2016)
题目描述 给你一个长度为m的数组(数组元素从0到m-1),如果数组里有a[i]+a[j]==a[k](i,j,k大于等于0并且小于m),便称之为三元组.现在给你一个数组,让你求三元组的个数. 例如m为 ...
- 总结下JavaWeb应用里正确显示中文需要的设置
1.前台页面需要加的设置: <%@ page contentType="text/html; charset=UTF-8"%> html标签后加上<meta ht ...
- PHP-MySQL,PHP-MySQLi,PDO的差异
PHP-MySQL是PHP操作MySQL数据库最原始的Extension ,PHP-MySQLi的i代表Improvement ,提供了更加高级的功能,就Extension而言,本身也增加了安全性.而 ...
- Qt Quick之StackView具体解释(1)
Qt Quick中有个StackView.我在<Qt Quick核心编程>一书中没有讲到.近期有人问起,趁机学习了一下,把它的基本使用方法记录下来. 我准备分两次来讲.第一次讲主要的使用方 ...
- MySQL优化之——触发器
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46763665 触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触 ...
- delphi中的HOOK [转贴]
按事件分类,有如下的几种常用类型的钩子: 1)键盘钩子可以监视各种键盘消息. 2)鼠标钩子可以监视各种鼠标消息. 3)外壳钩子可以监视各种Shell事件消息. 4)日志钩子可以记录从系统消息队列中取出 ...