AT_arc170_d Triangle Card Game

原题链接

当 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;
}
posted @ 2024-01-22 19:57  int_R  阅读(29)  评论(0编辑  收藏  举报