107212024-04-10 16:26:55peti1234A válaszadás nehézségeicpp17Elfogadva 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);

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