답안 #52411

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
52411 2018-06-25T22:19:28 Z Kubalionzzale 커다란 상품 (IOI17_prize) C++14
컴파일 오류
0 ms 0 KB
#include "prize.h"

#include <algorithm>
#include <set>
#include <map>

std::map<int, int> mapa;
//first - sum
//second - left

int find_best(int n) {

    if (n <= 500)
    {
        std::vector<int> get;
        for (int i = 0; i < n; ++i)
        {
            get = ask(i);

            if (get[0] == 0 && get[1] == 0)
            {
                return i;
            }
        }
    }


    int max = 0;
    std::vector<int> get;
    std::map<int, std::pair<int, int> > askedBig;
    for (int i = 0; i < 500; ++i)
    {
        get = ask(i);
        if (get[0] + get[1] > max)
        {
            max = get[0] + get[1];
        }
        if (get[0] == 0 && get[1] == 0)
        {
            return i;
        }

        int sum = get[0] + get[1];
        if (mapa.find(sum) == mapa.end())
        {
            mapa.insert(std::make_pair(sum, 0));
        }
        else
        {
            mapa[sum] = get[0];
        }
    }

    int cur = 499;
    while (1)
    {

        if (askedBig.find(cur) != askedBig.end())
        {
            get[0] = askedBig[cur].first;
            get[1] = askedBig[cur].second;
        }
        else
        {
            get = ask(cur);
            askedBig.insert(std::make_pair(cur, std::make_pair(get[0], get[1])));
        }

        if (get[0] == 0 && get[1] == 0)
        {
            return cur;
        }


        int s = get[0] + get[1];
        while (1 && s != max)
        {
            if (askedBig.find(cur + 1) != askedBig.end())
            {
                get[0] = askedBig[cur + 1].first;
                get[1] = askedBig[cur + 1].second;
            }
            else
            {
                get = ask(cur + 1);
                askedBig.insert(std::make_pair(cur + 1, std::make_pair(get[0], get[1])));
            }

            int inner = get[0] + get[1];
            if (inner == 0)
            {
                return cur + 1;
            }
            else if (inner != max)
            {
                mapa[inner] = get[0];
                ++cur;
            }
            else
            {
                mapa[inner] = get[0];
                break;
            }
        }

        int curs = 1 << 9;
        curs = std::min(n - 1, curs + cur)
        if (askedBig.find(curs) != askedBig.end())
        {
            get[0] = askedBig[curs].first;
            get[1] = askedBig[curs].second;
        }
        else
        {
            get = ask(curs);
            askedBig.insert(std::make_pair(curs, std::make_pair(get[0], get[1])));
        }

        int sum = get[0] + get[1];

        if (get[0] == 0 && get[1] == 0)
        {
            return curs;
        }

        bool flag2 = false;
        if (mapa.find(sum) == mapa.end())
            flag2 = true;
        if (get[0] > mapa[sum])
            flag2 = true;

        if (get[0] == 0 && sum != max)
        {
            mapa.insert(std::make_pair(sum, 0));

            cur = curs;
        }
        else if (get[0] == mapa[sum] && sum != max)
        {
            cur = curs;
        }
        else if (mapa.find(sum) == mapa.end())
        {
            flag2 = true;
        }
        else if (get[0] > mapa[sum])
        {
            flag2 = true;
        }
        else
        {
            cur = curs;
        }

        bool flag = false;
        for (int i = 8; i >= 0 && flag2; --i)
        {
            int nr = 1 << i;
            int toAsk = std::min(cur + nr, n - 1);

            if (askedBig.find(toAsk) != askedBig.end())
            {
                get[0] = askedBig[toAsk].first;
                get[1] = askedBig[toAsk].second;
            }
            else
            {
                get = ask(toAsk);
                askedBig.insert(std::make_pair(toAsk, std::make_pair(get[0], get[1])));
            }


            int sum = get[0] + get[1];

            if (get[0] == 0 && get[1] == 0)
            {
                return toAsk;
            }

            if (get[0] == 0 && sum != max)
            {
                mapa.insert(std::make_pair(sum, 0));

                cur = toAsk;
                flag = true;
                break;
            }
            else if (mapa.find(sum) == mapa.end())
            {
                continue;
            }
            else if (get[0] > mapa[sum])
            {
                continue;
            }
            else if (get[0] == mapa[sum] && sum != max)
            {
                cur = toAsk;
                flag = true;
                break;
            }
            else
            {
                cur = toAsk;
            }
        }

        if (!flag)
            ++cur;
    }
}

Compilation message

prize.cpp: In function 'int find_best(int)':
prize.cpp:108:9: error: expected ';' before 'if'
         if (askedBig.find(curs) != askedBig.end())
         ^~
prize.cpp:113:9: error: 'else' without a previous 'if'
         else
         ^~~~