Submission #144404

# Submission time Handle Problem Language Result Execution time Memory
144404 2019-08-16T19:55:05 Z dolphingarlic Unscrambling a Messy Bug (IOI16_messy) C++14
100 / 100
5 ms 632 KB
#include "messy.h"
#include <math.h>
#include <string>
#include <vector>
#define FOR(i, x, y) for (int i = x; i < y; i++)

std::vector<int> res;

void solve(int n, int levels, int l, int r, std::vector<int> inactive,
           std::vector<int> in_range) {
    if (l == r) {
        res[in_range[0]] = l;
    } else {
        std::vector<int> inside, outside;
        std::string base = "";
        FOR(i, 0, n) base += "0";
        for (int i : inactive) base[i] = '1';

        for (int i : in_range) {
            std::string s = base;
            s[i] = '1';

            if (check_element(s))
                inside.push_back(i);
            else
                outside.push_back(i);
        }

        int mid = (l + r) / 2;

        std::vector<int> left = inactive;
        left.insert(left.end(), outside.begin(), outside.end());
        solve(n, levels, l, mid, left, inside);

        std::vector<int> right = inactive;
        right.insert(right.end(), inside.begin(), inside.end());
        solve(n, levels, mid + 1, r, right, outside);
    }
}

void init(int n, int levels) {
    FOR(i, 0, n) {
        int l = 0, r = n - 1;

        for (int j = levels - 1; ~j; j--) {
            if (!(i & (1 << j))) {
                std::string s = "";
                FOR(k, 0, n) s += (k >= l && k <= r && k != i ? "0" : "1");
                add_element(s);
            }

            int mid = (l + r) / 2;
            if (i > mid)
                l = mid + 1;
            else
                r = mid;
        }
    }

    compile_set();
}

std::vector<int> restore_permutation(int n, int w, int r) {
    int levels = (int)log2(n);
    res.resize(n);
    std::vector<int> all;
    FOR(i, 0, n) all.push_back(i);

    init(n, levels);
    solve(n, levels, 0, n - 1, {}, all);

    return res;
}
# Verdict Execution time Memory Grader output
1 Correct 2 ms 256 KB n = 8
2 Correct 2 ms 256 KB n = 8
3 Correct 2 ms 376 KB n = 8
4 Correct 2 ms 256 KB n = 8
5 Correct 2 ms 256 KB n = 8
6 Correct 2 ms 376 KB n = 8
7 Correct 2 ms 256 KB n = 8
8 Correct 2 ms 376 KB n = 8
9 Correct 2 ms 376 KB n = 8
10 Correct 2 ms 376 KB n = 8
11 Correct 2 ms 376 KB n = 8
12 Correct 2 ms 252 KB n = 8
13 Correct 2 ms 256 KB n = 8
14 Correct 2 ms 376 KB n = 8
15 Correct 2 ms 376 KB n = 8
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB n = 32
2 Correct 2 ms 376 KB n = 32
3 Correct 2 ms 376 KB n = 32
4 Correct 2 ms 376 KB n = 32
5 Correct 2 ms 376 KB n = 32
6 Correct 2 ms 376 KB n = 32
7 Correct 2 ms 252 KB n = 32
8 Correct 2 ms 376 KB n = 32
9 Correct 2 ms 376 KB n = 32
10 Correct 2 ms 376 KB n = 32
11 Correct 3 ms 376 KB n = 32
12 Correct 2 ms 376 KB n = 32
13 Correct 2 ms 376 KB n = 32
14 Correct 2 ms 376 KB n = 32
15 Correct 2 ms 376 KB n = 32
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB n = 32
2 Correct 2 ms 376 KB n = 32
3 Correct 2 ms 376 KB n = 32
4 Correct 2 ms 376 KB n = 32
5 Correct 2 ms 376 KB n = 32
6 Correct 2 ms 376 KB n = 32
7 Correct 2 ms 376 KB n = 32
8 Correct 2 ms 376 KB n = 32
9 Correct 2 ms 376 KB n = 32
10 Correct 2 ms 376 KB n = 32
11 Correct 2 ms 376 KB n = 32
12 Correct 2 ms 376 KB n = 32
13 Correct 2 ms 376 KB n = 32
14 Correct 2 ms 376 KB n = 32
15 Correct 2 ms 376 KB n = 32
# Verdict Execution time Memory Grader output
1 Correct 5 ms 504 KB n = 128
2 Correct 5 ms 504 KB n = 128
3 Correct 5 ms 504 KB n = 128
4 Correct 5 ms 632 KB n = 128
5 Correct 5 ms 504 KB n = 128
6 Correct 5 ms 504 KB n = 128
7 Correct 4 ms 504 KB n = 128
8 Correct 5 ms 504 KB n = 128
9 Correct 5 ms 504 KB n = 128
10 Correct 5 ms 504 KB n = 128
11 Correct 5 ms 504 KB n = 128
12 Correct 4 ms 504 KB n = 128
13 Correct 5 ms 504 KB n = 128
14 Correct 5 ms 504 KB n = 128
15 Correct 4 ms 504 KB n = 128
# Verdict Execution time Memory Grader output
1 Correct 5 ms 504 KB n = 128
2 Correct 4 ms 508 KB n = 128
3 Correct 4 ms 504 KB n = 128
4 Correct 5 ms 504 KB n = 128
5 Correct 4 ms 504 KB n = 128
6 Correct 5 ms 504 KB n = 128
7 Correct 5 ms 504 KB n = 128
8 Correct 5 ms 504 KB n = 128
9 Correct 5 ms 504 KB n = 128
10 Correct 5 ms 504 KB n = 128
11 Correct 4 ms 504 KB n = 128
12 Correct 4 ms 504 KB n = 128
13 Correct 5 ms 504 KB n = 128
14 Correct 5 ms 504 KB n = 128
15 Correct 5 ms 504 KB n = 128