LibreOJ β Round #4

A游戏

内存限制:256 MiB时间限制:1000 ms标准输入输出
题目类型:传统评测方式:文本比较
上传者: qmqmqm

题目描述

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-1b1。

样例输入2

2
X
57

样例输出2

W

样例解释2

qmqmqm在第一个位置填入717171即可获胜。

数据范围与提示

1≤n≤1000001 \leq n \leq 1000001n100000

−109≤ai≤109-10^9 \leq a_i \leq 10^9109​​ai​​109​​

i≠ji \neq jij,则ai≠aja_i \neq 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;
}

 

 

posted @ 2017-09-04 09:31  暴力都不会的蒟蒻  阅读(371)  评论(0编辑  收藏  举报