A游戏
题目描述
qmqmqm和sublinekelzrip要进行一场游戏,其规则是这样的:
首先有一个序列,其中每个位置是一个整数或是X。双方轮流将X的位置填入此前不在序列中的实数,直到序列中充满数字为止。qmqmqm优先填数。若最后这个序列的逆序对数目为奇数,则qmqmqm获得胜利,否则sublinekelzrip获得胜利。qmqmqm想知道若双方均采取最优决策,在一个给定的序列下他能否获胜。设最终序列中第iii个数为aia_iai,则逆序对为满足i<ji<ji<j且ai>aja_i>a_jai>aj的有序对(i,j)(i,j)(i,j)的数目
注意虽然起始序列中只有整数,但可以填入非整数的实数。
输入格式
第一行包含一个正整数nnn,表示序列的长度。
之后nnn行,每行或为一个整数aia_iai,或为一个字符X。
输出格式
输出仅包含一个字符,若qmqmqm获胜,输出W
,否则输出L
。
样例
样例输入1
2
X
X
样例输出1
L
样例解释1
若qmqmqm在第一个位置填入aaa,则sublinekelzrip只要在后一个位置填入a+1a+1a+1。
若qmqmqm在第二个位置填入bbb,则sublinekelzrip只要在后一个位置填入b−1b-1b−1。
样例输入2
2
X
57
样例输出2
W
样例解释2
qmqmqm在第一个位置填入717171即可获胜。
数据范围与提示
1≤n≤1000001 leq n leq 1000001≤n≤100000
−109≤ai≤109-10^9 leq a_i leq 10^9−109≤ai≤109
若i≠ji eq ji≠j,则ai≠aja_i eq a_jai≠aj
这个题还是比较复杂的,得先分析X的作用,最后发现是X的个数为奇数偶数的问题。
然后在分析逆序对,注意有种情况是1 X
这个题我本来的树状数组模板不好,打算再更新下
#include <stdio.h> #include <bits/stdc++.h> using namespace std; const int N=100005; int w[N]; int la(int l,int r) { if(r-l==1) return 0; int m=l+r>>1,s=la(l,m)+la(m,r); for(int i=l; i<m; ++i) s+=lower_bound(w+m,w+r,w[i])-w-m; sort(w+l,w+r); return s&1; } int main() { int n; scanf("%d",&n); int t=0; for(int i=0; i<n; i++) { getchar(); char c[15]; scanf("%s",c); if(c[0]=='X')t++; else { sscanf(c,"%d",&w[i]); } } if(t) { if(n==1&&t==1||t%2==0) cout<<"L"<<endl; else cout<<"W"<<endl; } else { if(la(0,n)) cout<<"W"<<endl; else cout<<"L"<<endl; } return 0; }