Submission #836376

# Submission time Handle Problem Language Result Execution time Memory
836376 2023-08-24T10:43:07 Z Tigerpants Unscrambling a Messy Bug (IOI16_messy) C++17
100 / 100
2 ms 468 KB
#include <vector>
#include <algorithm>
#include <iostream>
#include <numeric>
#include <functional>
#include <set>
#include <map>
#include <bitset>
#include <bit>
#include <string>
#include "messy.h"

using namespace std;

typedef long long int ll;
typedef vector<ll> vll;
typedef set<ll> sll;
typedef vector<vll> vvll;
typedef bitset<128> bits;
typedef vector<bits> vbits;
typedef set<bits> sbits;
typedef vector<bool> vb;
typedef pair<bits, bool> pbits_b;
typedef vector<pbits_b> vpbits_b;

const ll TWO[8] = {1, 2, 4, 8, 16, 32, 64, 128};

#define rep(i, a, b) for (ll i = a; i < b; i++)
#define sz(a) (ll) a.size()
#define mp(a, b) make_pair(a, b)
#define pb(a) push_back(a)
#define trav(i, a, t) for (t::iterator i = a.begin(); i != a.end(); i++)

ll n, w, r;
ll b;

void add_elements(ll l, ll r) {
    if (l == r) return;

    // add elements with all outside [l, r] 1s, and first half of [l, r] containing one 1
    string s;
    rep(i, 0, l) s += '1';
    rep(i, l, r + 1) s += '0';
    rep(i, r + 1, n) s += '1';

    ll m = (l + r) / 2;
    rep(i, l, m + 1) {
        s[i] = '1';
        //cout << "added: " << s << endl;
        add_element(s);
        s[i] = '0';
    }

    add_elements(l, m);
    add_elements(m + 1, r);
}

vvll p;
std::vector<int> p_answ;

void check_elements(ll d, ll l, ll r, string& s) {
    if (l == r) {
        p_answ[p[d][l]] = l;
        return;
    }
    //cout << "check_elements(" << d << ", " << l << ", " << r << ") s: " << s << endl;

    // check how elements created by add_elements(l, r) have been displaced
    // the passed in string contains 1's where elements [0, l)U(r, n - 1] have been displaced
    // p[l:r] contains the set of indices to which [l, r] is displaced
    ll m = (l + r) / 2;
    // here we find p[l:m] and p[m+1:r]

    vll lm;
    vll mr;
    rep(i, l, r + 1) {
        s[p[d][i]] = '1';
        //cout << "check_element: " << s << " -> ";
        if (check_element(s)) {
            //cout << "true" << endl;
            lm.pb(p[d][i]);
        } else {
            //cout << "false" << endl;
            mr.pb(p[d][i]);
        }
        s[p[d][i]] = '0';
    }

    /* cout << "lm " << sz(lm) << " & mr " << sz(mr) << " s: " << s << endl;
    cout << "lm: ";
    trav(itr, lm, vll) {
        cout << *itr <<  " ";
    }
    cout << endl;
    cout << "mr: ";
    trav(itr, mr, vll) {
        cout << *itr << " ";
    }
    cout << endl; */

    rep(i, l, m + 1) {
        p[d + 1][i] = lm[i - l];
    }
    rep(i, m + 1, r + 1) {
        p[d + 1][i] = mr[i - (m + 1)];
    }

    // iterate downward
    rep(i, m + 1, r + 1) s[p[d + 1][i]] = '1';
    check_elements(d + 1, l, m, s);
    rep(i, m + 1, r + 1) s[p[d + 1][i]] = '0';

    rep(i, l, m + 1) s[p[d + 1][i]] = '1';
    check_elements(d + 1, m + 1, r, s);
    rep(i, l, m + 1) s[p[d + 1][i]] = '0';
}

std::vector<int> restore_permutation(int n_, int w_, int r_) {
    n = n_; w = w_; r = r_;
    // determine b
    b = 0; while (n ^ TWO[b]) b++;

    //cout << "add_elements" << endl;
    add_elements(0, n - 1);

    //cout << "compile_set" << endl;
    compile_set();

    //cout << "setup check_elements" << endl;
    p_answ.resize(n);
    p.resize(b + 1);
    rep(i, 0, b + 1) p[i].resize(n);
    rep(i, 0, n) p[0][i] = i;

    string s;
    rep(i, 0, n) s += "0";
    //cout << "check_elements" << endl;
    check_elements(0, 0, n - 1, s);

    return p_answ;
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 212 KB n = 8
2 Correct 1 ms 212 KB n = 8
3 Correct 1 ms 212 KB n = 8
4 Correct 1 ms 212 KB n = 8
5 Correct 0 ms 212 KB n = 8
6 Correct 0 ms 212 KB n = 8
7 Correct 0 ms 212 KB n = 8
8 Correct 0 ms 296 KB n = 8
9 Correct 0 ms 300 KB n = 8
10 Correct 1 ms 212 KB n = 8
11 Correct 1 ms 296 KB n = 8
12 Correct 1 ms 300 KB n = 8
13 Correct 0 ms 296 KB n = 8
14 Correct 0 ms 212 KB n = 8
15 Correct 0 ms 212 KB n = 8
# Verdict Execution time Memory Grader output
1 Correct 1 ms 212 KB n = 32
2 Correct 1 ms 212 KB n = 32
3 Correct 1 ms 212 KB n = 32
4 Correct 0 ms 212 KB n = 32
5 Correct 1 ms 212 KB n = 32
6 Correct 0 ms 324 KB n = 32
7 Correct 1 ms 212 KB n = 32
8 Correct 0 ms 212 KB n = 32
9 Correct 1 ms 212 KB n = 32
10 Correct 0 ms 212 KB n = 32
11 Correct 1 ms 212 KB n = 32
12 Correct 1 ms 212 KB n = 32
13 Correct 1 ms 212 KB n = 32
14 Correct 1 ms 212 KB n = 32
15 Correct 1 ms 212 KB n = 32
# Verdict Execution time Memory Grader output
1 Correct 1 ms 300 KB n = 32
2 Correct 0 ms 300 KB n = 32
3 Correct 1 ms 212 KB n = 32
4 Correct 1 ms 212 KB n = 32
5 Correct 1 ms 244 KB n = 32
6 Correct 0 ms 212 KB n = 32
7 Correct 1 ms 212 KB n = 32
8 Correct 1 ms 212 KB n = 32
9 Correct 1 ms 212 KB n = 32
10 Correct 0 ms 296 KB n = 32
11 Correct 1 ms 212 KB n = 32
12 Correct 0 ms 304 KB n = 32
13 Correct 1 ms 212 KB n = 32
14 Correct 1 ms 212 KB n = 32
15 Correct 1 ms 212 KB n = 32
# Verdict Execution time Memory Grader output
1 Correct 1 ms 468 KB n = 128
2 Correct 1 ms 468 KB n = 128
3 Correct 1 ms 468 KB n = 128
4 Correct 1 ms 468 KB n = 128
5 Correct 1 ms 424 KB n = 128
6 Correct 1 ms 424 KB n = 128
7 Correct 1 ms 468 KB n = 128
8 Correct 1 ms 420 KB n = 128
9 Correct 1 ms 468 KB n = 128
10 Correct 1 ms 468 KB n = 128
11 Correct 1 ms 468 KB n = 128
12 Correct 1 ms 468 KB n = 128
13 Correct 1 ms 468 KB n = 128
14 Correct 1 ms 424 KB n = 128
15 Correct 1 ms 468 KB n = 128
# Verdict Execution time Memory Grader output
1 Correct 1 ms 468 KB n = 128
2 Correct 1 ms 468 KB n = 128
3 Correct 1 ms 468 KB n = 128
4 Correct 1 ms 468 KB n = 128
5 Correct 2 ms 424 KB n = 128
6 Correct 1 ms 428 KB n = 128
7 Correct 1 ms 468 KB n = 128
8 Correct 1 ms 468 KB n = 128
9 Correct 1 ms 468 KB n = 128
10 Correct 1 ms 428 KB n = 128
11 Correct 1 ms 468 KB n = 128
12 Correct 1 ms 468 KB n = 128
13 Correct 1 ms 468 KB n = 128
14 Correct 1 ms 468 KB n = 128
15 Correct 1 ms 468 KB n = 128