답안 #620095

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
620095 2022-08-02T22:51:52 Z perchuts Unscrambling a Messy Bug (IOI16_messy) C++17
100 / 100
2 ms 564 KB
#include <bits/stdc++.h>
#define all(x) x.begin(), x.end()
#define sz(x) (int) x.size()
#define endl '\n'
#define pb push_back
#define _ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#include "messy.h"

using namespace std;

using ll = long long;
using ull = unsigned long long;
using ii = pair<int,int>;
using iii = tuple<int,int,int>;

const int inf = 2e9+1;
const int mod = 1e9+7;
const int maxn = 3e5+100;

template<typename X, typename Y> bool ckmin(X& x, const Y& y) { return (y < x) ? (x=y,1):0; }
template<typename X, typename Y> bool ckmax(X& x, const Y& y) { return (x < y) ? (x=y,1):0; }

// vector<int>restore_permutation(int n,int w,int r);

// namespace helper {

//     set<string> set_;
//     bool compiled = false;
//     int n;
//     vector<int> p;
//     int w;
//     int r;

//     int read_int() {
//         int x;
//         cin >> x;
//         return x;
//     }

// }

// using namespace helper;


// // A convenience function.
// int get_p(int i) {
//     int ret = p[i];
//     return ret;
// }

// int main() {
//     n = read_int();
//     w = read_int();
//     r = read_int();
//     p = vector<int>(n);
//     for (int i = 0; i < n; i++) {
//         p[i] = read_int();
//     }
//     vector<int> answer = restore_permutation(n, w, r);
    
//     if (answer.size() != n) {
//         printf("WA\n");
//         return 0;
//     }


//     printf("%d", answer[0]);

//     for (int i = 1; i < n; i++) {
//         printf(" %d", answer[i]);
//     }
//     printf("\n");
//     return 0;
// }

// void wa() {
//     printf("WA\n");
//     exit(0);
// }

// bool check(const string& x) {
//     if ((int)x.length() != n) {
//         return false;
//     }
//     for (int i = 0; i < n; i++) {
//         if (x[i] != '0' && x[i] != '1') {
//             return false;
//         }
//     }
//     return true;
// }

// void add_element(string x) {
//     if (--w < 0 || compiled || !check(x)) {
//         wa();
//     }
//     set_.insert(x);
// }

// bool check_element(string x) {
//     if (--r < 0 || !compiled || !check(x)) {
//         wa();
//     }
//     return set_.count(x);
// }

// void compile_set() {
//     if (compiled) {
//         wa();
//     }
//     compiled = true;
//     set<string> compiledSet;
//     string compiledElement = string(n, ' ');
//     for (set<string>::iterator it = set_.begin(); it != set_.end(); it++) {
//         string s = *it;
//         for (int i = 0; i < n; i++) {
//             compiledElement[i] = s[get_p(i)];
//         }
//         compiledSet.insert(compiledElement);
//     }
//     set_ = compiledSet;
// }


int presente[128][128];

bool mark[128];

vector<int> restore_permutation(int n, int w, int r) {
    int logn = 30 - __builtin_clz(n);

    for(int bit=logn;~bit;--bit){
        string act(n, '0');

        for(int i=0;i<n;++i)if(((i>>(bit+1))&1))act[i] = '1';

        for(int i=0;i<n;++i){
            if(((i>>bit)&1)){
                act[i] = '1' - act[i] + '0';
                // cout<<"+ "<<act<<endl;
                add_element(act);
                act[i] = '1' - act[i] + '0';
            }
        }
    }

    compile_set();

    string last(n,'0');

    for(int bit=logn;~bit;--bit){
        string nxt(n,'0');

        vector<int>taken;

        for(int i=0;i<n;++i)mark[i] = 0;
        
        // cout<<"inicio: "<<last<<endl<<endl;

        for(int i=0;i<n;++i){
            last[i] = '1' - last[i] + '0';
            // cout<<"? "<<last<<endl;
            if(check_element(last)){
                // cout<<" -achei!"<<endl;
                mark[i] = 1, nxt[i] = '1';
            }
            last[i] = '1' - last[i] + '0'; 
        }

        for(int i=0;i<n;++i){
            if(mark[i]){
                for(int j=0;j<n;++j)presente[i][j] += ((j>>bit)&1);
            }else{
                for(int j=0;j<n;++j)presente[i][j] += !((j>>bit)&1);
            }
        }
        last = nxt;
    }

    vector<int>resp;

    for(int i=0;i<n;++i){
        int pi = -1;
        for(int j=0;j<n;++j){
            if(presente[i][j]==logn+1){
                assert(pi==-1);
                pi = j;
            }
        }
        assert(pi!=-1);
        resp.pb(pi);
    }

    return resp;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB n = 8
2 Correct 1 ms 212 KB n = 8
3 Correct 0 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 212 KB n = 8
9 Correct 1 ms 212 KB n = 8
10 Correct 0 ms 212 KB n = 8
11 Correct 1 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 0 ms 212 KB n = 32
2 Correct 1 ms 340 KB n = 32
3 Correct 0 ms 212 KB n = 32
4 Correct 1 ms 340 KB n = 32
5 Correct 1 ms 212 KB n = 32
6 Correct 1 ms 308 KB n = 32
7 Correct 1 ms 340 KB n = 32
8 Correct 1 ms 340 KB n = 32
9 Correct 1 ms 212 KB n = 32
10 Correct 1 ms 340 KB n = 32
11 Correct 1 ms 340 KB n = 32
12 Correct 1 ms 212 KB n = 32
13 Correct 0 ms 212 KB n = 32
14 Correct 1 ms 212 KB n = 32
15 Correct 1 ms 340 KB n = 32
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB n = 32
2 Correct 1 ms 212 KB n = 32
3 Correct 0 ms 212 KB n = 32
4 Correct 0 ms 340 KB n = 32
5 Correct 1 ms 340 KB n = 32
6 Correct 1 ms 340 KB n = 32
7 Correct 1 ms 340 KB n = 32
8 Correct 1 ms 340 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 340 KB n = 32
13 Correct 1 ms 340 KB n = 32
14 Correct 1 ms 340 KB n = 32
15 Correct 1 ms 340 KB n = 32
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 468 KB n = 128
2 Correct 1 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 564 KB n = 128
6 Correct 1 ms 468 KB n = 128
7 Correct 1 ms 468 KB n = 128
8 Correct 2 ms 468 KB n = 128
9 Correct 2 ms 556 KB n = 128
10 Correct 2 ms 468 KB n = 128
11 Correct 1 ms 468 KB n = 128
12 Correct 2 ms 468 KB n = 128
13 Correct 1 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 556 KB n = 128
3 Correct 2 ms 468 KB n = 128
4 Correct 1 ms 468 KB n = 128
5 Correct 1 ms 560 KB n = 128
6 Correct 1 ms 556 KB n = 128
7 Correct 1 ms 468 KB n = 128
8 Correct 2 ms 468 KB n = 128
9 Correct 2 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 2 ms 468 KB n = 128
15 Correct 1 ms 468 KB n = 128