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

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

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

附上自己的错误尝试:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. int maxn=;
  6. int T,n,p,ans,g[];
  7. int dfs(int x)
  8. {
  9. if(g[x])return g[x]-;
  10. int ret=;
  11. for(int i=;i>=;i--)
  12. if(x&(<<i))
  13. {
  14. if((x&(<<(i-)))&&(x&(<<(i-)))==&&i->=)
  15. {
  16. int k=x-(<<i)+(<<(i-));
  17. // if(!dfs(k))
  18. // {
  19. // g[x]=2;
  20. // return 1;
  21. // }
  22. ret^=dfs(k);
  23. }
  24. if((x&(<<(i-)))==&&i->=)
  25. {
  26. int k=x-(<<i)+(<<(i-));
  27. // if(!dfs(k))
  28. // {
  29. // g[x]=2;
  30. // return 1;
  31. // }
  32. ret^=dfs(k);
  33. }
  34. }
  35.  
  36. if(!ret)g[x]=;
  37. else g[x]=;
  38. // printf("%d %d\n",x,g[x]-1);
  39. return g[x]-;
  40. }
  41. int main()
  42. {
  43. scanf("%d",&T);
  44. while(T--)
  45. {
  46. memset(g,,sizeof g);
  47. ans=;
  48. scanf("%d",&n);
  49. for(int i=,m;i<=n;i++)
  50. {
  51. p=;
  52. scanf("%d",&m);
  53. for(int j=,x;j<=m;j++)
  54. {
  55. scanf("%d",&x);
  56. x--;
  57. p|=(<<(-x));
  58. }
  59. // if(ans)continue;
  60. // if(dfs(p)==0)ans=1;
  61. ans^=dfs(p);
  62. }
  63. if(ans)printf("YES\n");
  64. else printf("NO\n");
  65. }
  66. return ;
  67. }

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

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

代码如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. int T,n,m,ans,sg[<<];
  6. bool vis[];
  7. void init(int x)
  8. {
  9. memset(vis,,sizeof vis);
  10. int w=;
  11. for(int i=;i<=;i++)//从小到大对应从右往左
  12. {
  13. int t=(<<(i-));
  14. if(x&t)
  15. {
  16. if(i>&&(x&(t>>))==)
  17. vis[sg[x-t+(t>>)]]=;
  18. // if(i>2&&(x&(t>>1))&&(x&(t>>2))==0)
  19. // vis[sg[x-t+(t>>2)]]=1;//读错题
  20. if((x&(t>>))&&w)
  21. vis[sg[x-t+(<<(w-))]]=;
  22. }
  23. else w=i;
  24. }
  25. int k=;//求mex
  26. while(vis[k])k++;
  27. sg[x]=k;
  28. }
  29. int main()
  30. {
  31. scanf("%d",&T);
  32. for(int i=;i<=(<<)-;i++)init(i);
  33. while(T--)
  34. {
  35. ans=;//!
  36. scanf("%d",&n);
  37. for(int i=;i<=n;i++)
  38. {
  39. scanf("%d",&m);
  40. int p=;
  41. for(int j=,x;j<=m;j++)
  42. {
  43. scanf("%d",&x);
  44. p|=(<<(-x));
  45. }
  46. ans^=sg[p];
  47. }
  48. if(ans)printf("YES\n");
  49. else printf("NO\n");
  50. }
  51. return ;
  52. }

洛谷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. File类 递归 获取目录下所有文件文件夹

    package com.xiwi; import java.io.*; import java.util.*; class file{ public static void main(String a ...

  2. Spring中使用byName实现Beans自动装配

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/beans-auto-wiring/spring-autowiring-byname.html: 此 ...

  3. SystemTap 静态探针安装包

     yum install systemtap-sdt-devel 

  4. 使用Reveal 调试iOS应用程序

    Itty Bitty Apps发布了一款实用工具——Reveal,它能够在运行时调试和修改iOS应用程序.Reveal能连接到应用程序,并允许开发者编辑各种用户界面参数,这反过来会立即反应在程序的UI ...

  5. 【hibernate】报错:org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.DataException: could not execute statement

    报错如下: org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a ...

  6. leetcode Valid Palindrome C++&amp;python 题解

    题目描写叙述 Given a string, determine if it is a palindrome, considering only alphanumeric characters and ...

  7. 集成CCFlow工作流与GPM的办公系统驰骋CCOA介绍(三)

    通过组织结构能够对项目的岗位.部门.人员进行增删改操作. 加入新部门.并为新部门加入人员: 选中部门后,点击鼠标右键,能够选择加入平级部门或下属部门. 新建部门时,须要给部门设置部门编号.名称.与部门 ...

  8. QVector的内存分配策略

    我们都知道 STL std::vector 作为动态数组在所分配的内存被填满时.假设继续加入数据,std::vector 会另外申请一个大小当前容量两倍的区域(假设 n > size 则申请 n ...

  9. VS2013 update4+Cocos2d-x 3.7 Win8下安装方法及配置

    1.安装VS 2013 update4 7个G.自己就去网上找吧,一大堆,密钥问度娘. 2.安装及配置python 2.x 这里注意,一定要下载python 3.0下面的版本号. 配置:进行环境变量配 ...

  10. asp.net mvc 性能优化——(1)静态化

    asp.net mvc 性能优化--(1)静态化 在改善页面性能的同时,可能会采用静态化的策略,对于不能实时静态化的内容,则采用缓存.本文主要讨论如何实现cshtml的静态化(实际上还不是完全的htm ...