【逆序对】游戏

传送门:LOJ524


思路:

进行分类讨论:

  • 如果整个序列没有X,那么就是求逆序对;
  • 如果整个序列就是X,那么没有逆序对,后手胜利;
  • 其余情况都是最后出的人赢,判断奇偶性即可。

注意:

分类较多,不要忘了没有X的情况


代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
int n,sum,tmp,a[100030],uni[100030],bit[200000];
inline int getint(){
char ch,l=' '; int x=0;
for (ch=getchar();(ch<'0' || ch>'9') && ch!='X';l=ch,ch=getchar());
if (ch=='X') return INF;
for (x=0;ch>='0' && ch<='9';ch=getchar()) x=x*10+ch-'0';
return l=='-'?-x:x;
}
void add(int x){for (int i=x;i;i-=i&(-i)) bit[i]++;}
int query(int x){int ss=0; for (int i=x;i<=n;i+=i&(-i)) ss+=bit[i]; return ss;}
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++){
a[i]=getint();
if (a[i]==INF) sum++;
}
if (sum==0){
for (int i=1;i<=n;i++) uni[i]=a[i];
sort(uni+1,uni+n+1);
for (int i=1;i<=n;i++) a[i]=lower_bound(uni+1,uni+n+1,a[i])-uni;
for (int i=1;i<=n;i++){tmp+=query(a[i]); add(a[i]);}
puts((tmp&1)?"W":"L"); return 0;
}
if ((sum&1) && n>1) puts("W"); else puts("L");
return 0;
}