107212024-04-10 16:26:55peti1234A válaszadás nehézségeicpp17Accepted 100/1001.284s3796 KiB
#include <bits/stdc++.h>
#include "AdamEsEva.h"

using namespace std;
const long long maxval=1e18, cel=67, speckerd=4; // hogy ne csorduljon tul
bool test=0;
long long valasz, igazdb, kerddb;
long long kezd[cel+1], veg[cel+1];

void process(long long a) {
    if (a>maxval) {
        a=1;
    }
    kerddb++;
    bool res=ask(a);
    for (int i=1; i<=cel; i++) {
        if (i>=kerddb) {
            if (res) kezd[i]=max(kezd[i], a);
            else veg[i]=min(veg[i], a-1);
        } else {
            if (res) veg[i]=min(veg[i], a-1);
            else kezd[i]=max(kezd[i], a);
        }
    }
}

long long calc(long long a) {
    long long sum=0;

    for (int i=1; i<=kerddb; i++) {
        long long s=veg[i]-max(kezd[i], a);
        if (s>=0) sum+=s+1;
    }
    for (int i=kerddb+1; i<=cel; i++) {
        long long s=min(veg[i], a-1)-kezd[i];
        if (s>=0) sum+=s+1;
    }
    return sum;
}


void new_game() {
    kerddb=0;
    for (int i=1; i<=cel; i++) {
        kezd[i]=1, veg[i]=maxval;
    }

    for (int i=1; i<=speckerd; i++) {
        process((kezd[cel]+veg[cel])/2);
    }

    for (int j=speckerd+1; j<=cel; j++) {
        long long sum=0;
        for (int i=1; i<=cel; i++) {
            if (kezd[i]<=veg[i]) {
                sum+=veg[i]-kezd[i]+1;
            }
        }
        long long fel=sum/2;
        long long lo=1, hi=maxval+1, mid, vallo=calc(lo), valhi=calc(hi), valmid;
        while (hi-lo>1) {
            mid=(hi+lo+1)/2;
            valmid=calc(mid);
            if ((valmid<=fel && vallo<=fel) || (valmid>fel && vallo>fel)) {
                lo=mid;
                vallo=valmid;
            } else {
                hi=mid;
                valhi=valmid;
            }
        }
        if (abs(valhi-fel)<abs(vallo-fel)) process(hi);
        else process(lo);
    }
    long long sum=0, res=0;
    for (int j=1; j<=cel; j++) {
        if (kezd[j]<=veg[j]) {
            res=kezd[j];
            sum+=veg[j]-kezd[j]+1;
        }
    }
    answer(res);

}
SubtaskSumTestVerdictTimeMemory
subtask1100/100
1Accepted1.212s1880 KiB
2Accepted1.23s2056 KiB
3Accepted1.161s2396 KiB
4Accepted1.22s2600 KiB
5Accepted1.241s2564 KiB
6Accepted1.241s2696 KiB
7Accepted1.235s2776 KiB
8Accepted1.235s2780 KiB
9Accepted1.228s2904 KiB
10Accepted1.235s2992 KiB
11Accepted1.192s3116 KiB
12Accepted1.195s3124 KiB
13Accepted1.268s3104 KiB
14Accepted1.228s3100 KiB
15Accepted1.274s3104 KiB
16Accepted1.194s3232 KiB
17Accepted1.276s3316 KiB
18Accepted1.225s3312 KiB
19Accepted1.246s3312 KiB
20Accepted1.284s3312 KiB
21Accepted1.281s3476 KiB
22Accepted1.246s3396 KiB
23Accepted1.277s3396 KiB
24Accepted1.268s3392 KiB
25Accepted1.273s3396 KiB
26Accepted1.202s3524 KiB
27Accepted1.276s3568 KiB
28Accepted1.266s3552 KiB
29Accepted1.266s3564 KiB
30Accepted1.195s3540 KiB
31Accepted1.195s3532 KiB
32Accepted1.246s3536 KiB
33Accepted1.18s3776 KiB
34Accepted1.253s3796 KiB
35Accepted1.2s3792 KiB
36Accepted1.208s3776 KiB