제출 #1368574

#제출 시각아이디문제언어결과실행 시간메모리
1368574bronze_coderUnscrambling a Messy Bug (IOI16_messy)C++20
100 / 100
1 ms580 KiB
#include "messy.h"
#include <bits/stdc++.h>
using namespace std;


vector<int> restore_permutation(int n,int w,int r){
    string s(n,'0');
    for(int i=0;i<n;i++){
        int x = 1;
        while(x<n){
            if(i&x){
                s[x] = '1';
                s[i] = '1';
                add_element(s);
                s[x] = '0';
                s[i] = '0';
            }
            x *= 2;
        }
    }
    vector<int> a = {1};
    while(a[a.size()-1]*2<n){
        a.push_back(a[a.size()-1]*2);
    }
    for(int i=0;i<a.size();i++){
        for(int j=0;j<=i;j++){
            if(i+j<a.size()){
                if(i==j){
                    for(int k=0;k<n;k++){
                        if(k!=a[i]){
                            s[k] = '1';
                        }
                    }
                    add_element(s);
                    for(int k=0;k<n;k++){
                        s[k] = '0';
                    }
                    continue;
                }
                s[a[i]] = '1';
                s[a[j]] = '1';
                add_element(s);
                s[a[i]] = '0';
                s[a[j]] = '0';
            }
        }
    }
    compile_set();
    string s1(n,'0');
    vector<int> ans(n,-1);
    vector<int> l;
    vector<int> c(n,0);
    for(int i=0;i<n;i++){
        s1[i] = '1';
        if(check_element(s1)){
            l.push_back(i);
            c[i] = 1;
        }
        s1[i] = '0';
    }
    map<pair<int,int>,int> m;
    for(int i:l){
        for(int j:l){
            if(j<i){
                s1[i] = '1';
                s1[j] = '1';
                if(check_element(s1)){
                    m[{i,j}] = 1;
                    m[{j,i}] = 1;
                }
                s1[i] = '0';
                s1[j] = '0';
            }
        }
    }
    for(int i:l){
        int z = 0;
        for(int j:l){
            if(i!=j){
                if(m[{i,j}]){
                    z++;
                }
            }
        }
        for(int j=0;j<n;j++){
            if(j!=i){
                s1[j] = '1';
            }
        }
        if(check_element(s1)){
            z += 1;
        }
        for(int j=0;j<n;j++){
            s1[j] = '0';
        }
        ans[i] = 1<<a.size()-z;
    }
    set<int> s2;
    for(int i=0;i<n;i++){
        s2.insert(i);
    }
    for(int i=1;i<n;i*=2){
        s2.erase(i);
    }
    for(int i=0;i<n;i++){
        vector<int> l1;
        for(int j:s2){
            l1.push_back(j);
        }
        if(ans[i]==-1){
            ans[i] = 0;
            for(int j:l){
                vector<int> l2;
                vector<int> l3;
                for(int k:l1){
                    if(k&ans[j]){
                        l2.push_back(k);
                    }
                    else{
                        l3.push_back(k);
                    }
                }
                if(l2.size()>0&&l3.size()>0){
                    s1[i] = '1';
                    s1[j] = '1';
                    if(check_element(s1)){
                        ans[i] ^= ans[j];
                        l1 = l2;
                    }
                    else{
                        l1 = l3;
                    }
                    s1[i] = '0';
                    s1[j] = '0';
                }
                else{
                    if(l2.size()>0){
                        l1 = l2;
                        ans[i] ^= ans[j];
                    }
                    else{
                        l1 = l3;
                    }
                }
            }
            s2.erase(ans[i]);
        }
    }
    return ans;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…