当 Alice 先出了一张牌 \(A\),Bob 又出了一张 \(B\),分类讨论一下。
当 \(B\leq A\),如果 Alice 不再出一张 \((A-B,A+B)\) 中的牌 Bob 就赢了,所以这种情况 Bob 会出最小的牌。
当 \(B>A\),如果 Alice 不再出一张 \((B-A,B+A)\) 中的牌 Bob 就赢了,这时无法贪心,对每个 \(B_i\) 考虑,找到 \(B_i\) 在 \(A\) 中第一个小于等于和第一个大于等于它的,取差值小的一个,则所有小于等于这个差值的 \(A_j\) 都可以被这个 \(B_i\) 卡掉。
但是还不完全,因为忘记了一条限制是不能重复出一张牌两次,所以当 \(A_j\) 等于这个第一个小于等于或第一个大于等于 \(B_i\) 的话,还可以在拓展一下,这种情况只能单独限制这一张牌。
当一个 \(A_j\) 不可以被任何一个 \(B_i\) 限制的时候 Alice 赢,否则 Bob 赢。
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=2e5+10;
int T,n,a[MAXN],b[MAXN],C[MAXN];
inline void work()
{
cin>>n;int cur=0;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=n;++i) cin>>b[i];
for(int i=1;i<=n;++i) C[i]=0;
sort(a+1,a+1+n),sort(b+1,b+1+n);
for(int i=1;i<=n;++i)
{
int now1=2e9,now2=2e9;
int c=upper_bound(a+1,a+1+n,b[i])-a-1;
int d=lower_bound(a+1,a+1+n,b[i])-a;
if(c>=1&&c<=n) now1=b[i]-a[c];
if(d>=1&&d<=n) now2=a[d]-b[i];
if(c>=1&&c<=n)
{
if(c-1>=1&&c-1<=n)
C[c]=max(C[c],min(b[i]-a[c-1],now2));
else C[c]=max(C[c],now2);
}
if(d>=1&&d<=n)
{
if(d+1>=1&&d+1<=n)
C[d]=max(C[d],min(a[d+1]-b[i],now1));
else C[d]=max(C[d],now1);
}
cur=max(cur,min(now1,now2));
}
for(int i=1;i<=n;++i)
{
bool flag=true;if(a[i]<=cur||a[i]<=C[i]) continue;
if(b[1]<=a[i])
{
int k=upper_bound(a+1,a+1+n,a[i]-b[1])-a;
if(k==i) ++k;if(k>n||a[k]>=a[i]+b[1]) flag=false;
}
if(flag){cout<<"Alice\n";return ;}
}
cout<<"Bob\n";return ;
}
int main()
{
cin.tie(0),cout.tie(0);
ios::sync_with_stdio(0);
cin>>T;while(T--) work();
return 0;
}
标签:Triangle,int,arc170,Alice,Game,MAXN,&&,等于,Bob
From: https://www.cnblogs.com/int-R/p/17980853/AT_arc170_d