题目大意
一个含数字和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");
}