博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[POI2004]GRA
阅读量:4677 次
发布时间:2019-06-09

本文共 2115 字,大约阅读时间需要 7 分钟。

Description

让我们考虑一个在m x 1 的板子上玩的游戏,板子被从1 到 m编号. 现在板子上有n 个棋子, 每个都严格占据板子上的一个格子. 没有一个棋子占据格子m. 每个单独的移动遵循以下原则: 移动的人选择一个棋子把它移动到比它大的格子中第一个未被占领的格子里去. 两个选手交替移动, 谁先占据格子m, 谁赢.下面是一个例子(m = 7), 一个选手可以把2 移到 4, 把3 移到 4 或者把6 移动到 7.
4538.jpg
我们说当前选手的移动是winning当且仅当他移动以后令一选手无论如何都无法赢他.
我们想知道先手有多少个移动是winning的.

Input

第一行有两个数m and n (2 <= m <= 109, 1 <= n <= 106, n < m) .
然后接下来n个上升的整数表示初始被占据的格子编号.

Output

输出先手有多少移动是winning的.

Sample Input

For the following input data1:
5 2
1 3
For the following input2 data:
5 2
2 3

Sample Output

the correct answer1 is:
1
the correct answer2 is:
0


本题看上去情况较多,有点复杂,但其实本题是Staircase Nim(阶梯Nim)的一个变种,我们只需要一些转换便可将其变成Staircase Nim。(Staircase Nim请参考中的例8)

本题显然只能将石子移到m-2上,谁先移到m-1谁输。我们考虑将其转化,连续的一段石子是其后面一个阶梯上的石子,两个连续的一堆间隔的空阶梯数是空格数。

肯定要加优化,也就是略去一些空阶梯,否则\(10^9\)直接炸飞。细节巨多……

/*program from Wolfycz*/#include
#include
#include
#include
#include
#define inf 0x7f7f7f7fusing namespace std;typedef long long ll;typedef unsigned int ui;typedef unsigned long long ull;inline int read(){ int x=0,f=1;char ch=getchar(); for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1; for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+ch-'0'; return x*f;}inline void print(int x){ if (x>=10) print(x/10); putchar(x%10+'0');}const int N=1e6;int val[N+10],step[N+10];int main(){ int m=read(),n=read(),tmp=0,tot=0,ans=0; for (int i=1;i<=n;i++) val[i]=read(); if (val[n]==m-1){ ans=1; for (int i=n-1;i&&val[i+1]-val[i]==1;i--) ans++; printf("%d\n",ans); return 0; } val[n+1]=m-1; for (int i=n;i;i--) if (val[i+1]-val[i]==1) step[tot]++; else if (val[i+1]-val[i]==2) step[++tot]=1; else if ((val[i+1]-val[i]-1)&1) tot+=3,step[tot]=1; else tot+=2,step[tot]=1; for (int i=1;i<=tot;i+=2) tmp^=step[i]; if (tmp){ for (int i=1;i<=tot;i+=2) if ((step[i]^tmp)
step[i-1]&&(step[i-1]^tmp)<=step[i-1]+step[i]) ans++; printf("%d\n",ans); }else putchar('0'); return 0;}

转载于:https://www.cnblogs.com/Wolfycz/p/8433592.html

你可能感兴趣的文章
“逻辑与”规则的最新认识
查看>>
asp.net mvc网站的发布与IIS配置
查看>>
JS创建Ajax的XMLHttpRequest对象的通用方法
查看>>
postgresql全文检索语法
查看>>
语音转写平台-非实时语音分割
查看>>
collections 模块常用方法学习
查看>>
HDU 5832 A water problem 大数取余
查看>>
微软官方中文新书《Windows Phone 7应用开发指南 》出版
查看>>
Python实现无向图最短路径
查看>>
《结网》—— 读后总结
查看>>
CSS复合选择器
查看>>
米勒罗宾素性测试(Miller–Rabin primality test)
查看>>
正则表达式介绍
查看>>
删除排序数组中的重复数字 II
查看>>
初始面向对象
查看>>
Linux下查看进程和端口信息
查看>>
windows 的文件夹映射实现
查看>>
初始函数与函数的参数
查看>>
Java PDF转换成图片并输出给前台展示
查看>>
(转载)Linux一句话精彩-5
查看>>