Submission #620095

#TimeUsernameProblemLanguageResultExecution timeMemory
620095perchutsUnscrambling a Messy Bug (IOI16_messy)C++17
100 / 100
2 ms564 KiB
#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; }
#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...