JZOJ 3339. 【NOI2013模拟】wyl8899和法法塔的游戏【NIM博弈】【暴力】


题目:

传送门


题意:

给出 n n n堆石子,要求我们在符合游戏规则的情况下,求出对于多组询问的法法塔取走最右端的石堆的石子并一定获胜的最大值


分析:

直接暴力模拟取石子的过程,而判断如何取石子则通过 N I M NIM NIM博弈来求解


代码:

#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define LL long long 
#define LZX IMU
using namespace std;
inline LL read() {
    LL d=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
    return d*f;
}   
int d[100005];
int main()
{
	int n=read();
	for(int i=1;i<=n;i++) d[i]=read();
	int q=read();
	while(q--)
	{
		int r=read(),a=read(),b=read();
		if(!d[r]) {printf("-1\n");continue;}
		if(b==r) {printf("%d\n",d[r]);d[r]=0;continue;}
		int w=0,ans=2147483647/3;
		for(int i=r-1;i>=a;i--) 
		{
			w^=d[i];
			if(i<=b) ans=min(ans,w);
		}
		if(d[r]-ans<=0) printf("-1\n"); else {printf("%d\n",d[r]-ans);d[r]=ans;} 
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值