题目:
题意:
给出 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;
}