[LibreOJ β Round #4]游戏

题目大意

一个含数字和X的序列。
两方轮流操作,每次在X里填入一个实数。
当X全部被填完时,根据序列逆序对的奇偶性判胜负。
问谁必胜。

做法

没有X的时候用数据结构求逆序对即可。
有X的时候,先特判n=1。
然后假设两人随便填,最后一个人填最后一个X时,假设最小数当前是t,显然他在这个位置填t+eps或t-eps可以使逆序对奇偶性不同。
他能直接获胜。
因此此时判断X个数的奇偶性即可。

#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
int a[100000+10],b[100000+10];
bool tree[100000+10];
int i,j,k,l,t,n,m,cnt;
bool czy;
int read(){
    int x=0,f=1;
    char ch=getchar();
    while (ch<'0'||ch>'9'){
        if (ch=='X'){
            czy=1;
            return 0;
        }
        if (ch=='-') f=-1;
        ch=getchar();
    }
    while (ch>='0'&&ch<='9'){
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
int lowbit(int x){
    return x&-x;
}
bool change(int x){
    while (x<=n){
        tree[x]^=1;
        x+=lowbit(x);
    }
}
bool query(int x){
    int t=0;
    while (x>0){
        t^=tree[x];
        x-=lowbit(x);
    }
    return t;
}
int main(){
    n=read();
    if (n==1){
        printf("L\n");
        return 0;
    }
    fo(i,1,n){
        czy=0;
        a[i]=read();
        if (czy) cnt++;
    }
    if (cnt>0){
        if (cnt%2==1) printf("W\n");else printf("L\n");
        return 0;
    }
    fo(i,1,n) b[i]=a[i];
    sort(b+1,b+n+1);
    fo(i,1,n) a[i]=lower_bound(b+1,b+n+1,a[i])-b,a[i]=n-a[i]+1;
    k=0;
    fo(i,1,n) k^=query(a[i]),change(a[i]);
    if (k) printf("W\n");else printf("L\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值