제출 #678805

#제출 시각아이디문제언어결과실행 시간메모리
678805SamNguyen동굴 (IOI13_cave)C++14
12 / 100
153 ms460 KiB
#include "cave.h"
#include <bits/stdc++.h>
using namespace std;

const int MAX = 5000 + 7;
int swit[MAX], door[MAX];

namespace Subtask1 {
    bool exploreCave(int N) {
        iota(door, door + N, 0);
        fill(swit, swit + N, 0);

        int cnt = 0;
        while (cnt <= N) {
            int i = tryCombination(swit);
            if (i == -1) {
                answer(swit, door);
                return true;
            }
            swit[i] ^= 1;
            cnt++;
        }

        return false;
    }
}

namespace Subtask2 {
    bool exploreCave(int N) {
        fill(swit, swit + N, 0);

        for (int i = 0; i < N; i++) {
            swit[i] = 1;
            door[i] = tryCombination(swit);
            swit[i] = 0;
        }
        answer(swit, door);

        return true;
    }
}

namespace Subtask3 {
    bool exploreCave(int N) {
        mt19937 rnd(20050701);
        generate(swit, swit + N, [&]() {
            return rnd() & 1;
        });

        int p = tryCombination(swit);
        while (p != -1) {
            for (int i = 0; i < N; i++) {
                swit[i] ^= 1;
                int p2 = tryCombination(swit);
                if (p2 > p or p2 == -1) {
                    p = p2;
                    break;
                }
                swit[i] ^= 1;
            }
        }

        for (int i = 0; i < N; i++) {
            swit[i] ^= 1;
            door[i] = tryCombination(swit);
            swit[i] ^= 1;
        }
        answer(swit, door);

        return true;
    }
}

namespace Subtask4 {
    mt19937 rnd(20050701);
    bool is_fixed[MAX];

    void randomise_switches(int N) {
        for (int i = 0; i < N; i++) if (not is_fixed[i])
            swit[i] = rnd() & 1;
    }

    bool exploreCave(int N) {
        fill(is_fixed, is_fixed + N, false);

        while (true) {
            randomise_switches(N);
            int p = tryCombination(swit);
            if (p == -1)
                break;

            for (int i = 0; i < N; i++) if (not is_fixed[i]) {
                swit[i] ^= 1;
                int p2 = tryCombination(swit);
                if (p2 > p or p2 == -1) {
                    p = p2;
                    break;
                }
                else if (p2 < p)
                    is_fixed[i] = true;
                swit[i] ^= 1;
            }
        }

        for (int i = 0; i < N; i++) {
            swit[i] ^= 1;
            door[i] = tryCombination(swit);
            swit[i] ^= 1;
        }
        answer(swit, door);

        return true;
    }
}

void exploreCave(int N) {
    Subtask4::exploreCave(N);
}
#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...