Language: C++

#include <bits/stdc++.h>
using namespace std;
const int MOD=1e9+7;
//const int MOD=998244353;
const long long LINF=1e18;
#define int long long
//template
template <typename T>
void fin(T a){
  cout<<a<<endl;
  exit(0);
}
/*
全体一個ずつだと小さい方から消えて行く
大きいの一山だと大きい方から消えて行く
残り一つにして相手に渡したら勝ち
i番目が最後の時かかるターンは？
v[i]+N-iターンで全部が消える
v[i]+N-iが奇数なら後手が、偶数なら先手が勝つ
v[i]-1==N-iみたいな状況に出来ると逆のことをすれば勝てる
v[i]-1とN-iを並べてみる
お互い出来るのは-1と+1と考えると？
v[i]-1とN-iの関係は？iが上がるとv[i]-1は上がってN-iは下がる
単純に常に相手と逆のことをしたらどうなる？
お互いk回ずつ行動した時、大きいのがk個消えて、全員k個減ってる
これで残り1つの山になるのはどんな時かと言うと
大きいのから数えてk+1個目がもともとk+1個以上あって、k+2個目がk個以内の時
この時k+1個目のやつ-kが奇数なら後手が勝って偶数なら先手が勝つ
これで後手が勝てるなら後手はこれをして勝つ
勝てないときは？
先手の最初の動きと同じ動きをすることでなんか変えられそう
例えばこれでたどり着き得る場所で両方さっきの状況が成り立てば勝ちなんだよね
いやもっと単純に、その3つの場所のうち
真ん中が後手勝ち->後手勝ち
真ん中が先手勝ち∩+か-が先手勝ち->先手勝ち
真ん中が先手勝ち∩+も-も後手勝ち->逃げ出せてないな
もっとこう、真ん中から見ていって、連続っぽいのがあった方の勝ちかな
つまり？
その時点での後手が勝ちに持っていけるようになったら勝ちなんだけど
大きいのを全部食べる操作をA、各一つずつをBとしたとき、山が最後の１個になる状態に対して
Aの方が一つ多くて山が偶数なら先手勝ち
いややっぱり連続してるところが先にあった方の勝ちな気がする
先手に対応していれば先手が勝っちゃいますよ、困ったをお互い繰り返し続けてる
両側に後手勝ちゾーンがあれば後手の勝ち
片側だけなら先手の勝ち
二分探索を使って各それに対しての勝敗を調べてあげればいい？
二分探索を書いてみるか
*/
int N;
std::vector<int> v(123456);
bool Fwin(int k){//最初のk回Aをした後に（その時点での）後手が相手に対応したら（もともとの）先手が勝ちますか
/*
大きいのがk個消えている
その後a回ずつやるので、大きいのがk+a消えてる∩全体がa減ってる
つまり、大きい方からk+a+1個目==v[k+a]がaより大きくk+a+2個目==v[k+a+1]がa以下であるようなaを探したい
そんなaがなかったら？
その後手の負け、先手は大きいの一つとって渡せるから
んでこのaをどうやって探すかと言うと
適当にaを設定して見たときに両方aより大きかったらaが小さすぎる
両方a以下だったらaが大きすぎる

んでこのaが見つかったら？
kが偶数、v[k+a]-aが奇数なら　後手の勝ち

見つからなかったら？
kが偶数なら先手の勝ち
*/
  int l=0,r=N-k,a;
  for(int i=0;i<25;i++){
    a=(l+r)>>1;//cout<<k<<" "<<a<<endl;
    if(v[k+a+1]>a)l=a;
    if(v[k+a]<=a)r=a;
    if(v[k+a]>a&&v[k+a+1]<=a)break;
  }
  if(v[k+a]>a&&v[k+a+1]<=a){
    if((k&1)^((v[k+a]-a)&1))return false;
    else return true;
  }
  if(k&1)return false;
  return true;
}
bool Fwin2(int k){
/*
考え方は概ねさっきと一緒
大きい方からa+1個目==v[a]がk+aより大きくてa+2個目==v[a+1]がk+a以下であるようなaを探したい
*/
  int l=0,r=N,a;
  for(int i=0;i<25;i++){
    a=(l+r)>>1;
    if(v[a]<=k+a)r=a;
    if(v[a+1]>k+a)l=a;
    if(v[a]>k+a&&v[a+1]<=k+a)break;
  }
  if(v[a]>k+a&&v[a+1]<=k+a){
    if((k&1)^((v[a]-k+a)&1))return false;
    else return true;
  }
  if(k&1)return false;
  return true;
}
//main
signed main(){
  cin>>N;
  for(int i=0;i<N;i++)cin>>v[i];
  sort(v.rbegin(),v.rend());
  for(int k=0;k<=N;k++){
    if(((k&1)+Fwin(k))==2)fin("First");
    if(((k&1)+Fwin(k))==0)break;
  }
  for(int k=0;k<=min(3e7,v[0]);k++){
    if(((k&1)+Fwin2(k))==2)fin("First");
    if(((k&1)+Fwin2(k))==0)break;
  }
  fin("Second");
}


Compiler output:
a.cc: In function 'int main()':
a.cc:110:21: error: no matching function for call to 'min(double, __gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type&)'
  110 |   for(int k=0;k<=min(3e7,v[0]);k++){
      |                  ~~~^~~~~~~~~~
In file included from /usr/include/c++/14/algorithm:60,
                 from /usr/include/x86_64-linux-gnu/c++/14/bits/stdc++.h:51,
                 from a.cc:1:
/usr/include/c++/14/bits/stl_algobase.h:233:5: note: candidate: 'template<class _Tp> constexpr const _Tp& std::min(const _Tp&, const _Tp&)'
  233 |     min(const _Tp& __a, const _Tp& __b)
      |     ^~~
/usr/include/c++/14/bits/stl_algobase.h:233:5: note:   template argument deduction/substitution failed:
a.cc:110:21: note:   deduced conflicting types for parameter 'const _Tp' ('double' and '__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type' {aka 'long long int'})
  110 |   for(int k=0;k<=min(3e7,v[0]);k++){
      |                  ~~~^~~~~~~~~~
/usr/include/c++/14/bits/stl_algobase.h:281:5: note: candidate: 'template<class _Tp, class _Compare> constexpr const _Tp& std::min(const _Tp&, const _Tp&, _Compare)'
  281 |     min(const _Tp& __a, const _Tp& __b, _Compare __comp)
      |     ^~~
/usr/include/c++/14/bits/stl_algobase.h:281:5: note:   candidate expects 3 arguments, 2 provided
In file included from /usr/include/c++/14/algorithm:61:
/usr/include/c++/14/bits/stl_algo.h:5686:5: note: candidate: 'template<class _Tp> constexpr _Tp std::min(initializer_list<_Tp>)'
 5686 |     min(initializer_list<_Tp> __l)
      |     ^~~
/usr/include/c++/14/bits/stl_algo.h:5686:5: note:   candidate expects 1 argument, 2 provided
/usr/include/c++/14/bits/stl_algo.h:5696:5: note: candidate: 'template<class _Tp, class _Compare> constexpr _Tp std::min(initializer_list<_Tp>, _Compare)'
 5696 |     min(initializer_list<_Tp> __l, _Compare __comp)
      |     ^~~
/usr/include/c++/14/bits/stl_algo.h:5696:5: note:   template argument deduction/substitution failed:
a.cc:110:21: note:   mismatched types 'std::initializer_list<_Tp>' and 'double'
  110 |   for(int k=0;k<=min(3e7,v[0]);k++){
      |                  ~~~^~~~~~~~~~