博弈

nim博弈//所有值异或为不为0必胜
链接:https://ac.nowcoder.com/acm/contest/86/E
来源:牛客网

是是非非
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
坎为水,险阳失道,渊深不测;离为火,依附团结,光明绚丽。
坎卦:水洊至,习坎;君子以常德行,习教事。一轮明月照水中,只见影儿不见踪,愚夫当财下去取,摸来摸去一场空。
离卦:明两作,离,大人以继明照四方。官人来占主高升,庄农人家产业增,生意买卖利息厚,匠艺占之大亨通。
有一些石子堆,第 ii 堆有 a_ia
i

个石子。你和算卦先生轮流从任一堆中任取若干颗石子(每次只能取自一堆,并且不能不取),取到最后一颗石子的人获胜。
算卦先生来问你,如果你先手,你是否有必胜策略?若是改动其中几个石子堆中石子的数量呢?
输入描述:
第一行两个正整数 n,qn,q,表示有 nn 个石堆,qq 次操作。
第二行 nn 个整数,第 ii 个数 a_ia
i

表示第 ii 个石堆初始有 a_ia
i

个石子。
接下去 qq 行,每行两个正整数 x,yx,y ,表示把第 xx 堆石子的个数修改成 yy。操作是累计的,也就是说,每次操作是在上一次操作结束后的状态上操作的。
输出描述:
共 qq 行,输出每次操作之后先手是否有必胜策略。
如果有,输出 \texttt{"Kan"}"Kan" ,否则输出 \texttt{"Li"}"Li" 。
示例1
输入
复制
5 4
6 7 3 4 5
1 6
2 1
2 4
5 5
输出
复制
Kan
Kan
Li
Li

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int main()
{
    int n, q, x, y;
    cin >> n >> q;
    for (int i = 1; i <= n; i++)cin >> a[i];
    int sum = a[1];
    for (int i = 2; i <= n; i++)sum ^= a[i];
    while (q--) {
        cin >> x >> y;
        sum ^= a[x];
        sum ^= y;
        a[x] = y;
        if (sum != 0)puts("Kan");
        else puts("Li");
    }
}
全部评论

相关推荐

11-04 14:10
东南大学 Java
_可乐多加冰_:去市公司包卖卡的
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务