Submission #1199199

#TimeUsernameProblemLanguageResultExecution timeMemory
1199199djs100201Unscrambling a Messy Bug (IOI16_messy)C++20
0 / 100
3 ms1344 KiB
    #include <bits/stdc++.h>
    using namespace std;
    using ll = long long;
    #include "messy.h"
    set<int>st[128];
    vector<int> restore_permutation(int n, int w, int r)
    {
        vector<int> res(n), rev(n),pl(3);
        //일단 0,1,2는 알아야 함
        for(int i=1;i<8;i++){
            string S(n, '0'), temp(n, '0');
            if(i&1)S[0]='1';
            if(i&2)S[1]='1';
            if(i&4)S[2]='1';
            for(int j=3;j+1<n;j++){
                if(j&(1<<(i-1))){
                    S[j]='1';
                    add_element(S);
                    S[j]='0';
                }
            }   
        }

        string S(n, '1');
        for (int i = 0; i < 3; i++)
        {
            S[i] = '0';
            add_element(S);
        }
        compile_set();
        string temp(n, '1');

        vector<int> ord(n);
        iota(ord.begin(), ord.end(), 0);  // ord = [0, 1, ..., n-1]
        random_device rd;
        mt19937 rng(rd());
        shuffle(ord.begin(), ord.end(), rng);

        for (int ii = 0; ii < 3; ii++)
        {
            for (int i = 0; i < n; i++)
            {
                if (temp[ord[i]] == '0')
                    continue;
                temp[ord[i]] = '0';
                if (check_element(temp))
                {
                    res[ord[i]] = ii;
                    pl[ii] = ord[i];
                    break;
                }
                temp[ord[i]] = '1';
            }
        }

        for(int i=3;i<n;i++){
            for(int j=0;j<n;j++){
                if(pl[0]==j || pl[1]==j || pl[2]==j)continue;
                st[i].insert(j);
            }
        }

        for(int i=1;i<8;i++){
            string S(n, '0');
            if(i&1)S[pl[0]]='1';
            if(i&2)S[pl[1]]='1';
            if(i&4)S[pl[2]]='1';
            vector<int>checked(n);

            for(int j=0;j<n;j++){
                if(pl[0]==j || pl[1]==j || pl[2]==j)continue;
                S[j]='1';
                if(check_element(S))checked[j]=1;
                S[j]='0';
            }

            for(int j=3;j+1<n;j++){
                if(j&(1<<(i-1))){
                    for (auto it = st[j].begin(); it != st[j].end(); ) {
                        if (!checked[*it]) {
                            it = st[j].erase(it);  // erase는 삭제 후 다음 iterator 반환
                        } else {
                            ++it;
                        }
                    }
                }
                else{
                    for (auto it = st[j].begin(); it != st[j].end(); ) {
                        if (checked[*it]) {
                            it = st[j].erase(it);  // erase는 삭제 후 다음 iterator 반환
                        } else {
                            ++it;
                        }
                    }
                }
            }
        }
        int sum=n*(n-1)/2-res[pl[0]]-res[pl[1]]-res[pl[2]];
        for(int i=3;i<n;i++){
            assert(st[i].size()==1);
            int x=*st[i].begin();
            res[x]=i;
            sum-=x;
        }
        res[sum]=n-1;
        return res;
    }

Compilation message (stderr)

messy.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
messy_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...