Submission #482059

#TimeUsernameProblemLanguageResultExecution timeMemory
482059RedhoodCheerleaders (info1cup20_cheerleaders)C++14
26 / 100
2079 ms7756 KiB
#include<bits/stdc++.h> #define pb push_back #define all(x) (x).begin(), (x).end() #define sz(x) (int)(x).size() #include<ext/pb_ds/assoc_container.hpp> #include<ext/pb_ds/tree_policy.hpp> #define fi first #define se second using namespace __gnu_pbds; using namespace std; using namespace __gnu_cxx; using namespace std; typedef long long ll; map < vector < int > , int > was; map < vector < int > , vector < int > > pr; int cnt; queue < vector < int > > Q; int F; void out(vector < int > p){ int b; b = F; for(auto i : p){ for(int f = b-1; f >= 0; --f){ if((1 << f) & i) cout<<1; else cout<<0; } cout << '\n'; } } const int N = (1 << 10) + 100; int fen[N]; void modify(int x , int pl){ for(; x < N; x += x & -x) fen[x] += pl; } int get(int p){ int ans = 0; for(; p > 0; p -= p & -p) ans += fen[p]; return ans; } ll inv(vector < int > &p){ ll ans = 0; for(int i : p){ ans += get(N - 1 - i); modify(N - 1 - i , +1); } for(int i : p) modify( N - 1 - i , -1); return ans; } vector < int > h; ll ans = 1e18; vector < int > answer; void rek(vector < int > pp){ /// first op was[pp] = 0; Q.push(pp); while(!Q.empty()){ vector < int > p = Q.front(); vector < int > P = p; for(int x = 0; x < sz(P); ++x) P[x] = h[P[x]]; ll now = inv(P); if(now < ans){ // cout << "LOL\n"; ans = now; answer = pr[p]; // for(auto u : pr[p]) // cout << u << ' '; // cout << endl; } Q.pop(); int st = was[p]; cnt++; vector < int > s; for(int i= 0; i < sz(p); ++i){ if((i+1) & 1) s.pb(p[i]); } for(int i= 0; i < sz(p); ++i){ if(i & 1) s.pb(p[i]); } if(was.find(s) == was.end()){ was[s] = st + 1; pr[s] = pr[p]; pr[s].pb(2); Q.push(s); } s.clear(); for(int i = sz(p)/2; i < sz(p); ++i){ s.pb(p[i]); } for(int i = 0; i < sz(p)/2;++i){ s.pb(p[i]); } if(was.find(s) == was.end()){ was[s] = st + 1; pr[s] = pr[p]; pr[s].pb(1); Q.push(s); } } } signed main(){ ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0); int n; cin >> n; F = n; h.resize((1 << n)); for(auto &i : h) cin >> i; vector < int > p((1 << n)); iota(all(p), 0); rek(p); cout << ans << endl; for(auto u : answer) cout<<u; return 0; }
#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...