10700 2024. 04. 09 23:11:25 mraron A válaszadás nehézségei cpp17 Elfogadva 100/100 2.4s 3888 KiB
#include "AdamEsEva.h"
#include <vector>
#include <utility>
#include <iostream>
#include <cassert>
using namespace std;
using ll = long long ;

const int K=67;

struct Response {
    ll guess;
    ll resp;
};

vector<pair<ll, ll>> calcIntervals(vector<Response>& history) {
    vector<pair<ll,ll>> res(K+1, make_pair(1LL, (ll)1e18));
    for(int lieAfter=1;lieAfter<=K;++lieAfter) {
        ll& L=res[lieAfter].first;
        ll& R=res[lieAfter].second;
        for(int j=0;j<(int)history.size();++j) {
            int lie = j>=lieAfter;
            if(history[j].resp^lie) {
                L=max(L, history[j].guess);
            }else {
                R=min(R, history[j].guess-1);
            }
        }
    }
    return res;
}

__int128 getHypothetical(vector<pair<ll,ll>>& ivs, int ind, ll x, ll resp) {
    __int128 res=0;
    for(int lieAfter=1;lieAfter<=K;++lieAfter) {
        ll L=ivs[lieAfter].first, R=ivs[lieAfter].second;
        int lie = ind>=lieAfter;
        if(resp^lie) {
            L=max(L, x);
        }else {
            R=min(R, x-1);
        }
        if(L<=R) res+=R-L+1;
    }
    return res;
}

ll deduce(vector<Response>& history) {
    ll ans=-1;
    for(int lieAfter=1;lieAfter<=history.size();++lieAfter) {
        long long L=1, R=ll(1e18);
        for(int j=0;j<(int)history.size();++j) {
            int lie = j>=lieAfter;
            if(history[j].resp^lie) {
                L=max(L, history[j].guess);
            }else {
                R=min(R, history[j].guess-1);
            }
        }
        if(L<=R) {
            assert(L==R);
            assert(ans==-1);
            ans=L;
        }
    }        
    assert(ans!=-1);
    return ans;
}

ll calc(vector<Response>& history) {
    ll L=1, R=ll(1e18)+1;
    auto ivs = calcIntervals(history);
    auto f=[&](ll x) -> __int128 {
        __int128 egyik = getHypothetical(ivs, history.size(), x, 0);
        __int128 masik = getHypothetical(ivs, history.size(), x, 1);
        return egyik-masik;
    };

    __int128 dR = f(R);
    while(L+1<R) {
        ll mid=(L+R)/2;
        auto val = f(mid);
        if((val>0 && dR>0) || (val<0 && dR<0)) {
            R=mid;
        }else {
            L=mid;
        }
    }
    return L;
}

ll search() {
    vector<Response> history;
    for(int i=0;i<K;++i) {
        ll to_ask = calc(history);
        history.push_back({to_ask, ask(to_ask)});
    }
    return deduce(history);
}

void new_game() {
    answer(search());
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 100/100
1 Elfogadva 2.326s 1812 KiB
2 Elfogadva 2.301s 2136 KiB
3 Elfogadva 2.28s 2344 KiB
4 Elfogadva 2.319s 2548 KiB
5 Elfogadva 2.28s 2516 KiB
6 Elfogadva 2.352s 2516 KiB
7 Elfogadva 2.319s 2520 KiB
8 Elfogadva 2.332s 2648 KiB
9 Elfogadva 2.331s 2860 KiB
10 Elfogadva 2.322s 3092 KiB
11 Elfogadva 2.4s 3156 KiB
12 Elfogadva 2.355s 3156 KiB
13 Elfogadva 2.344s 3152 KiB
14 Elfogadva 2.296s 3160 KiB
15 Elfogadva 2.375s 3288 KiB
16 Elfogadva 2.374s 3368 KiB
17 Elfogadva 2.367s 3400 KiB
18 Elfogadva 2.303s 3608 KiB
19 Elfogadva 2.312s 3540 KiB
20 Elfogadva 2.349s 3572 KiB
21 Elfogadva 2.339s 3676 KiB
22 Elfogadva 2.316s 3624 KiB
23 Elfogadva 2.311s 3652 KiB
24 Elfogadva 2.315s 3620 KiB
25 Elfogadva 2.395s 3616 KiB
26 Elfogadva 2.354s 3624 KiB
27 Elfogadva 2.375s 3624 KiB
28 Elfogadva 2.305s 3620 KiB
29 Elfogadva 2.391s 3628 KiB
30 Elfogadva 2.338s 3624 KiB
31 Elfogadva 2.336s 3752 KiB
32 Elfogadva 2.29s 3752 KiB
33 Elfogadva 2.397s 3764 KiB
34 Elfogadva 2.341s 3760 KiB
35 Elfogadva 2.342s 3760 KiB
36 Elfogadva 2.332s 3888 KiB