DTOJ#5334. 取石子游戏

该博客探讨了一种数学竞赛中的策略问题,涉及到选择的奇偶性和超现实数的概念。当Alice和Bob面临不同限制时,通过分析贡献值的奇偶性,利用线段树或平衡树维护前缀和来决定最优策略。博客内容包括具体算法实现和实例解析,展示了如何在复杂条件下确定先手优势。
摘要由CSDN通过智能技术生成

题目链接

首先易得,答案与 C i   m o d   ( a + b ) C_i\bmod (a+b) Cimod(a+b) 相同。超现实数
于是我们可以大力分讨。
a < b a<b a<b
a < C i ≤ b a<C_i\leq b a<Cib ,那么只能 Alice 选,对 Alice 有 C i a \frac{C_i}{a} aCi 的贡献
b < C i b<C_i b<Ci ,那么对于两人分别有 C i a − 1 , C i b − 1 {\frac{C_i}{a}-1,\frac{C_i}{b}-1} aCi1,bCi1 的贡献。(因为这几步必须先选,所以减一)。按照两者和从大到小排序,用数据结构(线段树或平衡树)维护奇偶前缀和。
最后记得讨论最后操作先后手。

#include<bits/stdc++.h>
#define N 100005
typedef long long ll;
using namespace std;
inline ll read(){
    ll x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
struct node{
	ll a,b;
	bool operator<(const node x)const{return a+b>x.a+x.b;}
}que[N];
int tot=0;
int main(){
	int n=read();
	ll A=0,B=0;
	while(n--){
		ll x=read(),a=read(),b=read();
		x%=(a+b);
		if(x>=max(a,b)){
			que[++tot].a=x/a-1,que[tot].b=x/b-1;
		}else{
			if(x>=a){
				A+=x/a;
			}
			if(x>=b){
				B+=x/b;
			}
		}
		sort(que+1,que+1+tot);
		ll na=A-B,nb=B-A;
		for(int i=1;i<=tot;++i){
			if(i&1){
				na+=que[i].a;
				nb+=que[i].b;
			}else{
				na-=que[i].b;
				nb-=que[i].a;
			}
		}
		na=(na>0)|((na==0)&(tot&1));
		nb=(nb>0)|((nb==0)&(tot&1));
		if(na&&nb){
			puts("First");
		}
		if(na&&nb==0){
			puts("Alice");
		}
		if(na==0&&nb){
			puts("Bob");
		}
		if(na==0&&nb==0){
			puts("Second");
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值