Submission #637547

#TimeUsernameProblemLanguageResultExecution timeMemory
637547boris_mihov커다란 상품 (IOI17_prize)C++17
0 / 100
3056 ms1840 KiB
#include "prize.h"
#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>

typedef long long llong;
const int MAXN = 200000 + 10;
const int INF  = 1e9;

int ans;
std::pair <int,int> asked[MAXN];
std::vector <int> res;
inline std::pair <int,int> query(int pos)
{
    if (asked[pos].first != -1) return asked[pos];
    res = ask(pos - 1);
    if (res[0] + res[1] == 0) ans = pos;
    return asked[pos] = {res[0], res[1]};
}

int leftCnt;
int rightCnt;
int cntBig;
int binarySearchLeft(int from, int to)
{
    int l = from, r = to - 1, mid;
    while (l < r - 1)
    {
        int mid = (l + r) / 2;
        auto [left, right] = query(mid);
        if (ans != 0) return -1;
        if (left + right != cntBig)
        {
            r = mid;
            continue;
        }

        if (left != leftCnt)
        {
            r = mid;
            continue;
        }

        l = mid;
    }

    leftCnt++;
    return r;
}

int binarySearchRight(int from, int to)
{
    int l = from + 1, r = to, mid;
    while (l < r - 1)
    {
        int mid = (l + r) / 2;
        auto [left, right] = query(mid);
        if (ans != 0) return -1;
        if (left + right != cntBig)
        {
            l = mid;
            continue;
        }

        if (right != rightCnt)
        {
            l = mid;
            continue;
        }

        r = mid;
    }

    rightCnt++;
    return l;
}


int find_best(int n) 
{
	srand(69);
    std::fill(asked + 1, asked + 1 + n, std::make_pair(-1, -1));
    for (int i = 1 ; i <= 10 ; ++i)
    {
        int rndPos = rand()%n + 1;
        cntBig = std::max(cntBig, query(rndPos).first + query(rndPos).second);
    }

    int l = 0, r = n + 1;
    while (ans == 0)
    {
        if (rand()%2 == 0) l = binarySearchLeft(l, r);
        else               r = binarySearchRight(l, r);
    }

    return ans - 1;
}

Compilation message (stderr)

prize.cpp: In function 'int binarySearchLeft(int, int)':
prize.cpp:27:31: warning: unused variable 'mid' [-Wunused-variable]
   27 |     int l = from, r = to - 1, mid;
      |                               ^~~
prize.cpp: In function 'int binarySearchRight(int, int)':
prize.cpp:54:31: warning: unused variable 'mid' [-Wunused-variable]
   54 |     int l = from + 1, r = to, mid;
      |                               ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...