結果

問題 No.3120 Lower Nim
ユーザー hiikunZ
提出日時 2025-04-18 22:57:09
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
RE  
実行時間 -
コード長 2,097 bytes
コンパイル時間 2,804 ms
コンパイル使用メモリ 223,764 KB
実行使用メモリ 26,356 KB
平均クエリ数 1925.43
最終ジャッジ日時 2025-04-18 22:57:21
合計ジャッジ時間 11,397 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 37 RE * 6
権限があれば一括ダウンロードができます

ソースコード

diff #

#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
using namespace std;
//#include<atcoder/all>
//using namespace atcoder;
using ll = long long int;
using ull = unsigned long long int;
using ld = long double;
constexpr ll MAX = 2000000000000000000;
constexpr ld PI = 3.14159265358979;
constexpr ll MOD = 0;//2024948111;
ld dotorad(ld K){ return PI * K / 180.0; }
ld radtodo(ld K){ return K * 180.0 / PI; }
mt19937 mt;
void randinit(){ srand((unsigned)time(NULL));mt = mt19937(rand()); }
int main(){
    ll N;
    cin >> N;
    vector<ll> A(N);
    for(ll i = 0; i < N; i++){
        cin >> A[i];
    }
    ll s = 0;
    for(ll i = 0;i < N;i++) s ^= A[i];
    ll p = 0;
    if(s == 0){
        cout << "Second" << endl;
        p = 1;
    }
    else{
        cout << "First" << endl;
    }
    set<tuple<ll,ll>> st;
    for(ll i = 0;i < N;i++){
        st.emplace(A[i],i);
    }
    ll K = MAX;
    while(1){
        if(p == 1){
            ll i,p;
            cin >> i >> p;
            i--;
            auto it = st.find(make_tuple(A[i],i));
            st.erase(it);
            s ^= A[i];
            A[i] -= p;
            s ^= A[i];
            st.emplace(A[i],i);
            K = p;
        }
        else{
            ll id = -1,x = MAX;
            auto p = st.rbegin();
            while(p != st.rend()){
                auto [a,i] = *p;
                ll disired_nokori = (A[i] ^ s);
                if(disired_nokori < A[i]){
                    ll kesu = A[i] - disired_nokori;
                    if(kesu <= K){
                        x = kesu;
                        id = i;
                        break;
                    }
                }
                p++;
            }

            auto it = st.find(make_tuple(A[id],id));
            st.erase(it);
            cout << id + 1 << " " << x << endl;
            s ^= A[id];
            A[id] -= x;
            st.emplace(A[id],id);
            s ^= A[id];
            assert(s == 0);
            K = x;
        }
        ll ret;
        cin >> ret;
        if(ret != 0) return 0;
        p ^= 1;
    }
}
0