大概没你们说得复杂吧......

\(Part\;1\) \(Nim\)游戏

大家都对异或和感到懵逼吧(排除大佬),其实很简单,用\(SG\)函数打表计算即可解决:

抛个板子:

void get_sg(int n)
{
memset(sg,0,sizeof(sg));
for(int i=1;i<=n;i++)
{
memset(S,0,sizeof(S));
for(int j=1;f[j]<=i&&j<=m;j++)
{
S[sg[i-f[j]]]=1;
}
for(int k=0;k<=n;k++)
{
if(!S[k])
{
sg[i]=k;
break;
}
}
}
}
//S[]代表能被表示的数
//f[]代表可以转移的方法

然后发现\(sg[a_i]=a_i\)(\(a_i\)为集合中元素个数),根据博弈论的常识知识即可知道答案。

\(Part\;2\) 取火柴游戏

一眼看出是\(Nim\)游戏的板子题,于是先上:

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int n,a[500005];
int sum=0;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]),sum^=a[i];
if(sum) printf("win\n");
else printf("lose\n");
return 0;
}

这人真粗鲁

不过仔细一看,还需要输出方案,其实也是很水的,证明如下:

我们都知道异或运算是满足结合律的,即\(a\;xor \;b\; xor\;c=a\;xor(b\;xor\;c)\),

并且\(a\;xor\;a=0\),这是为啥?

考虑异或定义: 二进制位相同为\(0\),不同为\(1\),显然同一个数二进制是一模一样的,异或为\(0\)。

根据上述,可得\(s\;xor\;a\;xor\;a=s\),这也就是说,异或的逆运算是他自己。

不过和这题有啥关系呢?

优化!

我们考虑求出所有数的异或和,每次用异或踢掉一个数,判断其余数的异或和\(sum\)能否被异或为\(0\),显然两数\(x,y\)异或和为\(0\),当且仅当\(x=y\).

解题

显然如果一个人在他的必胜态操作,使另一个人进入必败态,他就成功了,即异或和为\(0\),这样像前缀和一样处理出异或和,然后每次\(O(1)\)的转移就好了。,不过注意踢掉暂时不用的,若未找到姐解,再异或回来。

其他

这题是有些贪心的思路的,显然对一堆火柴操作,只有一个可行解(由于只有相同的数才异或为\(0\)),问题是如何让堆序最小,那从第一堆开始算就好了,找到的第一组解一定是最优解鸭\(qwq\)。

粘上简单修改的代码即可,复杂度是\(O(N)\)的,常数较小吧,足以通过此题。

\(Code\):

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int n,a[500005];
int sum=0;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]),sum^=a[i];
if(sum)
{
sum^=a[1];
for(int i=1;i<=n;i++)
{
if(sum<=a[i])//找到可行解
{
printf("%d %d\n",a[i]-sum,i);
for(int j=1;j<=n;j++)
{
if(j==i) printf("%d ",sum);
else printf("%d ",a[j]);
}
return 0;
}
sum=sum^a[i]^a[i+1];//这是精髓,注意把试验过的异或回来,把下一个数踢掉
}
}
else printf("lose\n");
return 0;
}

都看了,没个赞不好吧,大佬你觉得呢?

题解:luogu P1247的更多相关文章

  1. [题解] Luogu P5446 [THUPC2018]绿绿和串串

    [题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,..., ...

  2. 题解 Luogu P2499: [SDOI2012]象棋

    关于这道题, 我们可以发现移动顺序不会改变答案, 具体来说, 我们有以下引理成立: 对于一个移动过程中的任意一个移动, 若其到达的位置上有一个棋子, 则该方案要么不能将所有棋子移动到最终位置, 要么可 ...

  3. 题解 luogu P1144 【最短路计数】

    本蒟蒻也来发一次题解第一篇请见谅 这个题有几个要点 1.无向无权图,建图的时候别忘记建来回的有向边[因此WA掉1次 2.无权嘛,那么边长建成1就好了2333333 3.最短路采用迪杰斯特拉(别忘用堆优 ...

  4. 题解 Luogu P1110 【[ZJOI2007]报表统计】

    感谢 @cmy962085349 提供的hack数据,已经改对了. 先声明,我好像是题解里写双$fhq$ $treap$里唯一能过的...(最后两个点啊) 思路:首先看题目,$MIN_GAP_SORT ...

  5. 题解 Luogu P3370

    讲讲这题的几种做法: 暴力匹配法 rt,暴力匹配,即把字符串存起来一位一位判相等 时间复杂度$ O(n^2·m) $ 再看看数据范围 \(n\le10^5,m\le10^3\) 当场爆炸.当然有暴力分 ...

  6. 题解 Luogu P3623 [APIO2008]免费道路

    [APIO2008]免费道路 题目描述 新亚(New Asia)王国有 N 个村庄,由 M 条道路连接.其中一些道路是鹅卵石路,而其它道路是水泥路.保持道路免费运行需要一大笔费用,并且看上去 王国不可 ...

  7. Luogu P1247 取火柴游戏

    题目链接 \(Click\) \(Here\) 这个题目其实就是一个\(Nim\)游戏的简单模型.对于单个的\(Nim\)游戏(单独一堆的情况),数学归纳可证其\(SG\)函数值等于其石子个数.所以对 ...

  8. [题解]luogu P4116 Qtree3

    终于来到了Qtree3, 其实这是Qtree系列中最简单的一道题,并不需要线段树, 只要树链剖分的一点思想就吼了. 对于树链剖分剖出来的每一根重链,在重链上维护一个Set就好了, 每一个Set里存的都 ...

  9. 题解 Luogu P3959 【宝藏】

    来一篇不那么慢的状压??? 话说这题根本没有紫题难度吧,数据还那么水 我是不会告诉你我被hack了 一看数据规模,n≤12,果断状压. 然后起点要枚举,就设dp状态: f[i][j]=以i为起点到j状 ...

随机推荐

  1. 教育片- Economics by Crash Course(共35集)(未完结)

    第一集Intro to Economics: Crash Course Econ #1 传送门:https://www.youtube.com/watch?v=3ez10ADR_gM&list ...

  2. ElementUI 删除 el-table 当前选中行(不是selection列)

    一句话即可: this.表格绑定的data.splice(this.$refs.表格的ref.store.states.selection, 1)

  3. 装有Ubuntu的硬盘插入到电脑中无法进入

    前言 前段时间,由于自己作死,将BIOS的CPU电压设置解锁,导致BIOS芯片烧坏.在将电脑返厂维修后,我把装有Ubuntu18.04系统的固态硬盘插入到电脑中,但是电脑无法进入grub,采取任何方法 ...

  4. tensorflow简介、目录

    目前工作为nlp相关的分类及数据治理,之前也使用tensorflow写过一些简单分类的代码,感受到深度学习确实用处较大,想更加系统和全面的学习下tensorflow的相关知识,于是我默默的打开了b站: ...

  5. notepad++一次去掉所有空行,然后加上2个空行

    打开替换窗口,查找我的目标中填写: ^\r\n 替换为中不填,空着, 点击全部替换按钮. 如何给所有行添加2行空行: 打开替换窗口,查找目标中填写: \r\n 替换为中填写: \r\n\r\n\r\n ...

  6. Codeforces Round #551 (Div. 2)D(树形DP)

    #define HAVE_STRUCT_TIMESPEC#include <bits/stdc++.h>using namespace std;int val[300007],num[30 ...

  7. linux 基本命令学习总结

    1. linux的目录结构  (linux核心:一切皆文件) 目录结构解释 (主要的有 /etc  /home  /mnt  /opt  /usr   /tmp) 相对路径和绝对路径的区别 绝对路径  ...

  8. 解题报告:luogu P2220

    指挥使走后一脸懵逼,然后想起了一道水\(SB\)的省选题. 这是毒瘤乘法分配率的应用,似乎还有一篇,算是入门题. 对了,这题连接:P2220 [HAOI2012]容易题 然而蒟蒻还是先自闭了一会... ...

  9. SpringMVC 接收表单数据、数据绑定、解决请求参数中文乱码

    接收表单数据有3种方式. 1.使用简单类型接收表单数据(绑定简单数据类型) 表单: <form action="${pageContext.request.contextPath}/u ...

  10. uniGUI之uniColorButton(21)

    uniColorButton相当于VCL的ColorDialog1 若Palette 为空,则为系统自带颜色.