Submission #784303

#TimeUsernameProblemLanguageResultExecution timeMemory
784303TrunktyCheerleaders (info1cup20_cheerleaders)C++14
100 / 100
595 ms5492 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll

int n,ans=2e18;
vector<int> vans;
int arr[500005],newarr[500005];
int vals[21][3];

void bigsplit(){
    for(int i=0;i<(1<<n);i++){
        newarr[i/2+((i%2)*(1<<n-1))] = arr[i];
    }
    for(int i=0;i<(1<<n);i++){
        arr[i] = newarr[i];
    }
}

vector<int> dnc(int l, int r, int j){
    if(l==r){
        return {arr[l]};
    }
    int mid = (l+r)/2;
    vector<int> a = dnc(l,mid,j+1), b = dnc(mid+1,r,j+1);
    vector<int> c;
    int pos=0;
    for(int i=0;i<a.size();i++){
        while(pos<b.size() and a[i]>b[pos]){
            c.push_back(b[pos]);
            pos++;
            vals[j][1] += a.size()-i;
        }
        c.push_back(a[i]);
    }
    while(pos<b.size()){
        c.push_back(b[pos]);
        pos++;
    }
    pos=0;
    for(int i=0;i<b.size();i++){
        while(pos<a.size() and b[i]>a[pos]){
            pos++;
            vals[j][2] += b.size()-i;
        }
    }
    return c;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n;
    for(int i=0;i<(1<<n);i++){
        cin >> arr[i];
    }
    if(n==0){
        cout << 0 << "\n";
        cout << "\n";
        return 0;
    }
    for(int i=1;i<=n;i++){
        bigsplit();
        for(int j=0;j<=n-1;j++){
            vals[j][1] = 0;
            vals[j][2] = 0;
        }
        dnc(0,(1<<n)-1,0);
        int tot=0;
        for(int j=0;j<=n-1;j++){
            tot += min(vals[j][1],vals[j][2]);
        }
        if(tot<ans){
            ans = tot;
            vans.clear();
            for(int j=1;j<=i;j++){
                vans.push_back(2);
            }
            for(int j=n-1;j>=0;j--){
                vans.push_back(2);
                if(vals[j][1]>vals[j][2]){
                    vans.push_back(1);
                }
            }
        }
    }
    cout << ans << "\n";
    for(int i:vans){
        cout << i;
    }
    cout << "\n";
    return 0;
}

Compilation message (stderr)

cheerleaders.cpp: In function 'void bigsplit()':
cheerleaders.cpp:13:32: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   13 |         newarr[i/2+((i%2)*(1<<n-1))] = arr[i];
      |                               ~^~
cheerleaders.cpp: In function 'std::vector<long long int> dnc(ll, ll, ll)':
cheerleaders.cpp:28:18: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   28 |     for(int i=0;i<a.size();i++){
      |                 ~^~~~~~~~~
cheerleaders.cpp:29:18: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |         while(pos<b.size() and a[i]>b[pos]){
      |               ~~~^~~~~~~~~
cheerleaders.cpp:36:14: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |     while(pos<b.size()){
      |           ~~~^~~~~~~~~
cheerleaders.cpp:41:18: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   41 |     for(int i=0;i<b.size();i++){
      |                 ~^~~~~~~~~
cheerleaders.cpp:42:18: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   42 |         while(pos<a.size() and b[i]>a[pos]){
      |               ~~~^~~~~~~~~
#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...