답안 #601162

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
601162 2022-07-21T12:15:13 Z MohamedAliSaidane Unscrambling a Messy Bug (IOI16_messy) C++14
0 / 100
1 ms 468 KB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include "messy.h"

        using namespace std;
        using namespace __gnu_pbds;


        ///#define int long long

        typedef tree<int,null_type,less<int>,rb_tree_tag,
        tree_order_statistics_node_update> indexed_set;

        typedef long long ll;

        typedef pair<int,int> pii;
        typedef pair<ll,ll> pll;

        typedef vector<int> vi;
        typedef vector<ll> vll;
        typedef vector<pii> vpi;
        typedef vector<pll> vpl;

        #define ff first
        #define ss second

        #define pb push_back
        #define popb pop_back
        #define all(x) (x).begin(),(x).end()

        vi 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;
        }
        */
        std::vector<int> restore_permutation(int n, int w, int r)
        {
            srand(time(0));
            string cur = "";
            for(int i = 0; i < n; i++)
                cur += '1';
            for(int i = 0; i < n; i++)
            {
                cur[i] =  '0';
                add_element(cur);
            }
            compile_set();
            string ans = "";
            indexed_set rem;
            for(int i = 0; i< n;i ++)
                rem.insert(i);
            for(int i=  0 ; i <n ;i ++)
                ans += '1';
            vi p(n);
            for(int i = 0; i < n;i ++)
            {
                int sz = rem.size();
                vi rv;
                int cor = -1;
                while(cor == -1)
                {
                    int idx = (rand() % sz);
                    idx = *(rem.find_by_order(idx));
                    ans[idx] = '0';
                    rem.erase(idx);
                    if(check_element(ans))
                    {
                        cor = idx;
                    }
                    else
                    {
                        rv.pb(idx);
                    }
                }
                for(auto e: rv)
                    rem.insert(e);
                p[cor] = i;
            }
            return p;
        }
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 212 KB grader returned WA
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1 ms 340 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1 ms 340 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1 ms 432 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1 ms 468 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -