牛客小白月赛2 E:是是非非(尼姆博弈)

链接:https://www.nowcoder.com/acm/contest/86/E
来源:牛客网
 

题目描述

坎为水,险阳失道,渊深不测;离为火,依附团结,光明绚丽。
坎卦:水洊至,习坎;君子以常德行,习教事。一轮明月照水中,只见影儿不见踪,愚夫当财下去取,摸来摸去一场空。
离卦:明两作,离,大人以继明照四方。官人来占主高升,庄农人家产业增,生意买卖利息厚,匠艺占之大亨通。 

有一些石子堆,第  堆有  个石子。你和算卦先生轮流从任一堆中任取若干颗石子(每次只能取自一堆,并且不能不取),取到最后一颗石子的人获胜。 

算卦先生来问你,如果你先手,你是否有必胜策略?若是改动其中几个石子堆中石子的数量呢?

输入描述:

第一行两个正整数 ,表示有 个石堆, 次操作。 

第二行 个整数,第 个数 表示第 个石堆初始有 个石子。 

接下去 行,每行两个正整数 ,表示把第 堆石子的个数修改成 。操作是累计的,也就是说,每次操作是在上一次操作结束后的状态上操作的。

输出描述:

 行,输出每次操作之后先手是否有必胜策略。

如果有,输出  ,否则输出  。 

 

输入

5 4
6 7 3 4 5
1 6
2 1
2 4
5 5

输出

Kan
Kan
Li
Li

备注:

利用异或运算,如果所有堆中的数异或的结果不为0,则先取者获胜。(这个好像叫什么奇异局势

该题的思想可以看这里

一个比较详细的讲解取石子问题的博客

该题需要注意的是异或运算应该在输入后就进行,不能在后面更改元素后用循环来算,会TLE。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e6+10;
ll a[maxn];
int main()
{
	ll n,q;
	ll x,y;
	ll sum=0;
	scanf("%lld%lld",&n,&q);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	sum=a[1];
	for(int i=2;i<=n;i++)
	{
		sum=sum^a[i];
	}//这步操作不能放在后面的循环中
	while(q--)
	{
		scanf("%lld%lld",&x,&y);
		ll mm=a[x]^y;//mm记录a[x]和y的异或值
		a[x]=y;//更改a[x]的值
		sum=sum^mm;
		if(sum) printf("Kan\n");
		else printf("Li\n");
	}
	return 0;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值