답안 #582709

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
582709 2022-06-24T10:24:30 Z MadokaMagicaFan Unscrambling a Messy Bug (IOI16_messy) C++14
100 / 100
2 ms 480 KB
#include <bits/stdc++.h>

using namespace std;

using ll = long long;
using vi = vector<int>;
using pi = pair<int,int>;

#define all(v)          v.begin(),v.end()
#define sort(v)         sort(all(v))
#define endl            '\n'
#define forn(i,n)       for(int i = 0; i < n; ++i)
#define forbe(i,b,e)    for(int i = b; i < e; ++i)
#define forr(i,n)       for(int i = n-1; i >= 0; --i)
#define sz(v)           ((int)v.size())
#define pb              push_back
#define f               first
#define s               second

void add_element(std::string x);
bool check_element(std::string x);
void compile_set();

vi perm;

std::vector<int> sub12(int n)
{
    string x;
    forn(i,n)
        x.pb('0');
    forn(i,n-1) {
        x[i] = '1';
        add_element(x);
    }

    compile_set();

    vector<bool> fnd(n);
    vi perm(n);

    forn(i,n)
        x[i] = '0';

    forn(i,n-1) {
        forn(j,n) {
            if (fnd[j]) continue;
            x[j] = '1';
            if (check_element(x)) {
                fnd[j] = 1;
                perm[j] = i;
//                cout << j << ' ' << i << endl;
                break;
            }
            x[j] = '0';
        }
    }

    forn(i,n) {
        if (fnd[i]) continue;
        perm[i] = n-1;
    }

    return perm;
}

void bs(int l, int r, string s) {
    int mid = (l+r)>>1;

    if (l == r-1)
        return;

    forn(i, sz(s))
        s[i] = '1';
    forbe(i,l,r)
        s[i] = '0';

    forbe(i,l,mid) {
        s[i] = '1';
        add_element(s);
        s[i] = '0';
    }

    forbe(i,l,mid)
        s[i] = '1';

//    forbe(i,mid,r) {
//        s[i] = '1';
//        add_element(s);
//        s[i] = '0';
//    }


    bs(l,mid,s);
    bs(mid,r,s);
}

void bs2(int l, int r, string s, vector<bool> us) {
    int mid = (l+r)>>1;

    if (l == r-1) {
        forn(i,sz(s)) {
            if (!us[i]) {
                perm[i] = l;
                break;
            }
        }
        return;
    }

    vector<bool> lf, rt;
    lf = rt = us;

    forn(i, sz(s))
        if (us[i])
            s[i] = '1';
        else
            s[i] = '0';

    vi le, re;
    forn(i, sz(s)) {
        if (us[i])
            continue;
        s[i] = '1';
        if (check_element(s)) {
            le.pb(i);
            rt[i] = 1;
        }
        else {
            re.pb(i);
            lf[i] = 1;
        }
        s[i] = '0';
    }

//    cout << l << ' ' << r << endl;
//    cout << "L:";
//    forn(i,sz(le))
//        cout << ' ' << le[i];
//    cout << endl;
//    cout << "R:";
//    forn(i,sz(re))
//        cout << ' ' << re[i];
//    cout << endl;
    bs2(l,mid,s,lf);
    bs2(mid,r,s,rt);
}

std::vector<int> subrest(int n)
{
    string x;
    forn(i,n)
        x.pb('0');

    bs(0,n,x);

    compile_set();

    vector<bool> fnd(n);
    perm.resize(n);
    forn(i,n)
        perm[i] = i;

//    return perm;
    bs2(0,n,x,fnd);

    return perm;
}

std::vector<int> restore_permutation(int n, int w, int r) {
    return subrest(n);
    if (n == 8) return sub12(n);
    else if (n == 32 && r == 1024) return sub12(n);

    return subrest(n);
    vi ans;
    return ans;
}

#ifdef ONPC
vi rperm;
set<string> nmb;
int _w = 0;
int _r = 0;
int _n;

void add_element(std::string x) {
    ++ _w;
    string rs;
    forn(i,sz(x)) {
        rs.pb('0');
        rs[i] = x[rperm[i]];
    }
    cout << x << ' ' << rs << endl;
    nmb.insert(rs);
}
bool check_element(std::string x) {
//    cout << x << ' ' << nmb.count(x) << endl;
++ _r;
return nmb.count(x);}
void compile_set() {}


void solve() {
    int n, w, r;
    cin >> n >> w >> r;
    _n = n;

    rperm.resize(n);

    forn(i,n)
        cin >> rperm[i];

    vi ans = restore_permutation(n,w,r);

    cout << _w << ' ' << _r << endl;
    forn(i,n)
        cout << ans[i] << ' ';
    cout << endl;
}

int main() {
    freopen("in", "r", stdin);
//    ios_base::sync_with_stdio(0);cin.tie(0);
    solve();
}
#endif
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB n = 8
2 Correct 0 ms 212 KB n = 8
3 Correct 0 ms 212 KB n = 8
4 Correct 1 ms 212 KB n = 8
5 Correct 1 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 212 KB n = 8
9 Correct 0 ms 212 KB n = 8
10 Correct 1 ms 212 KB n = 8
11 Correct 0 ms 212 KB n = 8
12 Correct 0 ms 212 KB n = 8
13 Correct 0 ms 212 KB n = 8
14 Correct 1 ms 212 KB n = 8
15 Correct 0 ms 212 KB n = 8
# 결과 실행 시간 메모리 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 1 ms 212 KB n = 32
5 Correct 1 ms 212 KB n = 32
6 Correct 1 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 1 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
# 결과 실행 시간 메모리 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 1 ms 212 KB n = 32
5 Correct 1 ms 212 KB n = 32
6 Correct 1 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 1 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
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 468 KB n = 128
2 Correct 2 ms 468 KB n = 128
3 Correct 2 ms 468 KB n = 128
4 Correct 1 ms 468 KB n = 128
5 Correct 2 ms 468 KB n = 128
6 Correct 1 ms 468 KB n = 128
7 Correct 2 ms 468 KB n = 128
8 Correct 2 ms 468 KB n = 128
9 Correct 2 ms 468 KB n = 128
10 Correct 2 ms 480 KB n = 128
11 Correct 1 ms 468 KB n = 128
12 Correct 2 ms 468 KB n = 128
13 Correct 2 ms 468 KB n = 128
14 Correct 2 ms 468 KB n = 128
15 Correct 2 ms 468 KB n = 128
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 468 KB n = 128
2 Correct 2 ms 468 KB n = 128
3 Correct 2 ms 468 KB n = 128
4 Correct 1 ms 468 KB n = 128
5 Correct 1 ms 468 KB n = 128
6 Correct 1 ms 428 KB n = 128
7 Correct 2 ms 468 KB n = 128
8 Correct 2 ms 468 KB n = 128
9 Correct 2 ms 468 KB n = 128
10 Correct 2 ms 468 KB n = 128
11 Correct 2 ms 468 KB n = 128
12 Correct 2 ms 468 KB n = 128
13 Correct 2 ms 428 KB n = 128
14 Correct 1 ms 468 KB n = 128
15 Correct 2 ms 468 KB n = 128