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 |