Submission #476637

#TimeUsernameProblemLanguageResultExecution timeMemory
476637leakedCheerleaders (info1cup20_cheerleaders)C++14
35 / 100
2111 ms281240 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

#define m_p make_pair
#define f first
#define s second
#define vec vector
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define pw(x) (1LL<<(x))
#define sz(x) (int)x.size()
#define fast_ioi ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);

using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef long double ld;
typedef pair<long long,long long> pll;
template <class T> bool umin(T &a,const T &b){return (a>b?a=b,1:0);}
template <class T> bool umax(T &a,const T &b){return (a<b?a=b,1:0);}
auto rng=bind(uniform_int_distribution<int>(1,20),mt19937(time(0)));
#define sim template < class c
#define ris return * this
#define dor > debug & operator <<
#define eni(x) sim > typename \
  enable_if<sizeof dud<c>(0) x 1, debug&>::type operator<<(c i) {
sim > struct rge { c b, e; };
sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
sim > auto dud(c* x) -> decltype(cerr << *x, 0);
sim > char dud(...);
struct debug {
#ifndef LOCAL
~debug() { cerr << endl; }
eni(!=) cerr << boolalpha << i; ris; }
eni(==) ris << range(begin(i), end(i)); }
sim, class b dor(pair < b, c > d) {
  ris << "(" << d.first << ", " << d.second << ")";
}
sim dor(rge<c> d) {
  *this << "[";
  for (auto it = d.b; it != d.e; ++it)
	*this << ", " + 2 * (it == d.b) << *it;
  ris << "]";
}
#else
sim dor(const c&) { ris; }
#endif
};
#define imie(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
const int N=2001;
const ll inf=1e18;
const int M=1e9+7;
int n;
template <class T> using oset=tree <T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
void move1(vec<int> &p){
    for(auto &z : p){
        z=z^(pw(n-1));
    }
}
void move2(vec<int> &p){
    for(auto &z : p){
        z=(z>>1)|((z&1)*(pw(n-1)));
    }
}
vec<int> getxr(int x){
    vec<int>need(n+1,0);
    for(int i=0;i<n;i++){
        if(pw(i)&x){
            need[n-i-1]=1;
        }
    }
    vec<int>vc;
    for(int i=n-1;i>=0;i--){
//        if(need[i]) vc.pb(1);
        vc.pb(2);
        if(need[i]) vc.pb(1);
//        if(need[i]) vc.pb(2);
    }
    vec<int>lel={0};
    for(auto &z : vc){
        if(z==1) move1(lel);
        else move2(lel);
    }
//    debug()<<imie(lel)imie(x)imie(vc);
    assert(lel[0]==x);
    return vc;
}
signed main(){
    fast_ioi;
    cin>>n;

//    for(int i=0;i<(1<<n);i++) getxr(i);
//    return 0;
    vec<int>a(1<<n);
    for(auto &z : a) cin>>z;
    ll total=inf;
    vec<int>rops;
    vec<int>p(1<<n);
    iota(all(p),0);
    vec<int>vt;
    for(int f=0;f<n;f++){
        vec<vec<oset<int>>>cnt(n,vec<oset<int>>(1<<n,oset<int>()));
        vec<vec<ll>>how(n,vec<ll>(2,0));
        vec<vec<ll>>st(n,vec<ll>(2,0));
        for(int i=0;i<n;i++){
            int full=pw(n)-pw(i);
            for(int j=0;j<(1<<n);j++){
//                debug()<<imie(i)imie(full);
                cnt[i][(full&p[j])].insert(a[j]);
            }
        }
//        for(int i=0;i<(1<<n);i++){
//            for(int j=0;j<i;j++){
//                int w=p[i]^p[j];
//                w=31-__builtin_clz(w);
//                if(w==0)debug()<<imie(p[i])imie(p[j])imie(a[i])imie(a[j]);
//                if(p[i]<p[j]){
//                    if(a[i]>a[j]) st[w][0]++;
//                    else st[w][1]++;
//                }
//                else{
//                    if(a[i]>a[j]) st[w][1]++;
//                    else st[w][0]++;
//                }
//            }
//        }
        for(int i=0;i<n;i++){
            int full=pw(n)-pw(i);
            for(int j=0;j<(1<<n);j++){
                if((p[j]&pw(i))==0) continue;
                int me=(full&p[j]);
                int yj=cnt[i][me^(1<<i)].order_of_key(a[j]);
                how[i][1]+=yj;
//                debug()<<imie(how[i][0])imie(sz(cnt[me^(1<<i)])-how[i][0]);
                how[i][0]+=sz(cnt[i][me^(1<<i)])-yj;
            }
        }
        int w=0;ll ans=0;
        for(int i=0;i<n;i++){
//            debug()<<imie(how[i][0])imie(how[i][1]);
            if(how[i][0]<how[i][1]) ans+=how[i][0];
            else ans+=how[i][1],w^=(1<<i);
        }
//        debug()<<imie(st)imie(how);
//        assert(st==how);
        vec<int>ops=getxr(w);
//        if(f) {
        for(auto &q : vt) ops.insert(ops.begin(),2);
        if(umin(total,ans)){
            rops=ops;
        }
        move2(p);vt.pb(2);
//        cout<<endl;
    }
    cout<<total<<endl;
    for(auto &z : rops)
        cout<<z;
    return 0;
}
/*

*/

Compilation message (stderr)

cheerleaders.cpp: In function 'int main()':
cheerleaders.cpp:152:19: warning: unused variable 'q' [-Wunused-variable]
  152 |         for(auto &q : vt) ops.insert(ops.begin(),2);
      |                   ^
#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...