Submission #1146392

#TimeUsernameProblemLanguageResultExecution timeMemory
1146392daveleUnscrambling a Messy Bug (IOI16_messy)C++20
100 / 100
2 ms584 KiB
#include <vector> #ifndef davele #include "messy.h" #endif // davele #include <bits/stdc++.h> #define pii pair<int, int> #define fi first #define se second #define vi vector <int> #define pq priority_queue #define MASK(i) (1ll<<(i)) #define BIT(x, i) (((x) >> (i)) & 1) #define x0 ___x0 #define y0 ___y0 #define div ___div #define next ___next #define prev ___prev #define left ___left #define right ___right #define pos pisosi #define pb push_back #define pf push_front using namespace std; //const int mod = ; //void add (int &a, const int&b){ // a+=b; // if (a>=mod) a-=mod; //} // //void sub (int&a, const int&b){ // a-=b; // if (a<0) a+=mod; //} // //void mul (int&a, const int&b){ // a*=b; // a%=mod; //} template<class X, class Y> bool minimize(X &x, const Y&y){ if (x<=y) return false; else{ x = y; return true; } } template<class X, class Y> bool maximize (X &x, const Y&y){ if (x>=y) return false; else{ x = y; return true; } } ///////////////////////////////////////////////////////////////////////////////// //const int lim = , limit = , inf = ; //// dang nhap ham #ifndef davele int N; vector <int> ret; void dncw (int l, int r){ // cerr<<l<<" "<<r<<"\n"; if (l==r) return; int mid = (l+r)/2; string tmp(N, '1'); for (int i=l; i<=r; i++) tmp[i] = '0'; for (int i=l; i<=mid; i++){ tmp[i] = '1'; add_element(tmp); tmp[i] = '0'; } dncw (l, mid); dncw(mid+1, r); } void dncr (int l, int r, vi&pos){ // cerr<<l<<" "<<r<<":\n"; // for (int x:pos) cerr<<x<<" "; // cerr<<"\n"; if (l==r){ // cerr<<l<<" "<<pos[0]<<"\n"; // cerr<<pos.size()<<"\n"; ret[pos[0]] = l; return; } string tmp (N, '1'); for (int x:pos) tmp[x]='0'; vector <int> left, right; for (int i=0; i<pos.size(); i++){ tmp[pos[i]]='1'; // cerr<<" "<<pos[i]<<" "<<tmp<<"\n"; if (check_element(tmp)){ // cerr<<"a\n"; left.pb(pos[i]); } else right.pb(pos[i]); tmp[pos[i]]='0'; } int mid = (l+r)/2; // cerr<<l<<" "<<r<<" "<<mid<<" "<<left.size()<<" "<<right.size()<<"\n"; dncr (l, mid, left); dncr (mid+1, r, right); } vector<int> restore_permutation(int n, int w, int r) { N = n; for (int i=0; i<n; i++) ret.pb(-1); dncw(0, n-1); // cerr<<"ok"; vector <int> ac; for (int i=0; i<n; i++) ac.pb(i); // cerr<<"ok"; compile_set(); dncr(0, n-1, ac); return ret; } #endif // davele // //// chay thu ham main: // #ifdef davele int n, w, r; int p[1005]; set <string> set_; void add_element(string x) { // cerr<<x<<"\n"; set_.insert(x); } bool check_element(string x) { // cerr<<"b "<<x<<" "<<set_.count(x)<<"\n"; return set_.count(x); } void compile_set() { 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[p[i]]; } // cerr<<s<<" "<<compiledElement<<"\n"; compiledSet.insert(compiledElement); } set_ = compiledSet; // cerr<<set_.size()<<"\n"; // for (string x:set_) cerr<<x<<" "; // cerr<<"\n"; } int N; vector <int> ret; void dncw (int l, int r){ // cerr<<l<<" "<<r<<"\n"; if (l==r) return; int mid = (l+r)/2; string tmp(N, '1'); for (int i=l; i<=r; i++) tmp[i] = '0'; for (int i=l; i<=mid; i++){ tmp[i] = '1'; add_element(tmp); tmp[i] = '0'; } dncw (l, mid); dncw(mid+1, r); } void dncr (int l, int r, vi&pos){ // cerr<<l<<" "<<r<<":\n"; // for (int x:pos) cerr<<x<<" "; // cerr<<"\n"; if (l==r){ // cerr<<l<<" "<<pos[0]<<"\n"; // cerr<<pos.size()<<"\n"; ret[pos[0]] = l; return; } string tmp (N, '1'); for (int x:pos) tmp[x]='0'; vector <int> left, right; for (int i=0; i<pos.size(); i++){ tmp[pos[i]]='1'; // cerr<<" "<<pos[i]<<" "<<tmp<<"\n"; if (check_element(tmp)){ // cerr<<"a\n"; left.pb(pos[i]); } else right.pb(pos[i]); tmp[pos[i]]='0'; } int mid = (l+r)/2; // cerr<<l<<" "<<r<<" "<<mid<<" "<<left.size()<<" "<<right.size()<<"\n"; dncr (l, mid, left); dncr (mid+1, r, right); } vector<int> restore_permutation(int n, int w, int r) { N = n; for (int i=0; i<n; i++) ret.pb(-1); dncw(0, n-1); // cerr<<"ok"; vector <int> ac; for (int i=0; i<n; i++) ac.pb(i); // cerr<<"ok"; compile_set(); dncr(0, n-1, ac); return ret; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); // // freopen (".inp", "r", stdin); // freopen (".out", "w", stdout); cin>>n>>w>>r; for (int i=0; i<n; i++) cin>>p[i]; vi tmp = restore_permutation(n, w, r); for (int x:tmp) cout<<x<<" "; } #endif // davele ////////////////////////////////////////////////////////////////////////////

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...