제출 #1018352

#제출 시각아이디문제언어결과실행 시간메모리
1018352vjudge1동굴 (IOI13_cave)C++17
100 / 100
347 ms604 KiB
    #include <bits/stdc++.h>
    #include "cave.h"
    using namespace std;
    #define ALL(x) (x).begin(), (x).end()
    #define set(x, v) fill(ALL(x), v)
    typedef vector<int> vi;
     
    void exploreCave(int N)
    {
        vi switches(N, 0);
        vi revS(N, 0);  // the correct position of each switch corresponding to door i
        vi D(N, -1);    // element D[i] should contain the door number that switch i is connected to
        vi revD(N, -1); // element revD[i] should contain the switch number that door i is connected to
        bool done = false;
        for (int i = 0; i < N; i++)
        {
            if (i > 0)
                set(switches, 0);
            for (int j = 0; j < N; j++)
            {
                if (revD[j] == -1)
                    break;
                switches[revD[j]] = revS[j];
            }
            revS[i] = tryCombination(switches.data()) == i;
            int min = 0, max = N - 1;
            while (max - min > 0)
            {
                int s = (max + min) / 2;
                set(switches, !revS[i]);
                fill(switches.begin() + min, switches.begin() + s + 1, revS[i]);
                for (int j = 0; j < N; j++)
                {
                    if (revD[j] == -1)
                        break;
                    switches[revD[j]] = revS[j];
                }
                int d = tryCombination(switches.data());
                if (d == -1)
                {
                    done = true;
                    break;
                }
                if (d > i)
                {
                    if (s == max)
                        throw;
                    max = s;
                }
                else
                {
                    min = s + 1;
                }
            }
            if (done)
                break;
            revD[i] = min;
            D[min] = i;
        }
                for (int j = 0; j < N; j++)
                {
                    if (revD[j] == -1)
                        break;
                    switches[revD[j]] = revS[j];
                }
        for (int i = 0; i < N; i++)
        {
            if (D[i] != -1)
                continue;
            switches[i] = !switches[i];
            int d = tryCombination(switches.data());
            D[i] = d;
            switches[i] = !switches[i];
        }
        answer(switches.data(), D.data());
    }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...