제출 #703314

#제출 시각아이디문제언어결과실행 시간메모리
703314SamNguyen동굴 (IOI13_cave)C++14
51 / 100
201 ms404 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];

    pair<int, int> find_switch_for_door(int i, int l, int r) {
        if (l == r) {
            if (not is_fixed[r])
                swit[r] ^= 1;
            int p = tryCombination(swit);
//            cerr << "try " << i << " " << l << " " << r << " -> " << p << endl;
            if (not is_fixed[r])
                swit[r] ^= 1;

            if (p == i)
                return make_pair(swit[r], r);
            return make_pair(swit[r] ^ 1, r);
        }

        int m = (l + r) >> 1;
        for (int x = l; x <= m; x++) if (not is_fixed[x])
            swit[x] ^= 1;
        int p1 = tryCombination(swit);
//        cerr << "try " << i << " " << l << " " << m << " -> " << p1 << endl;
        for (int x = l; x <= m; x++) if (not is_fixed[x])
            swit[x] ^= 1;
        int p2 = tryCombination(swit);
//        cerr << "try " << i << " " << l << " " << m << " -> " << p2 << endl;

        if (p1 == i xor p2 == i)
            return find_switch_for_door(i, l, m);
        return find_switch_for_door(i, m + 1, r);
    }

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

        for (int i = 0; i < N; i++) {
            int res, p;
            tie(res, p) = find_switch_for_door(i, 0, N - 1);
            door[p] = i;
            swit[p] = res;
            is_fixed[p] = true;
        }

        answer(swit, door);
        return true;
    }
}

void exploreCave(int N) {
    Subtask4::exploreCave(N);
}

컴파일 시 표준 에러 (stderr) 메시지

cave.cpp: In function 'std::pair<int, int> Subtask4::find_switch_for_door(int, int, int)':
cave.cpp:102:16: warning: suggest parentheses around comparison in operand of '^' [-Wparentheses]
  102 |         if (p1 == i xor p2 == i)
      |             ~~~^~~~
#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...