Submission #428601

#TimeUsernameProblemLanguageResultExecution timeMemory
428601kai824Cheerleaders (info1cup20_cheerleaders)C++17
26 / 100
2108 ms361704 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int b=2,b2=13,mod=1000000007;

int n;

int ft[150000];
#define ls(x) (x&(-x))
void update(int p){
  for(;p<=(1<<n);p+=ls(p))ft[p]++;
}
int query(int p){
  int ans=0;
  for(;p;p-=ls(p))ans+=ft[p];
  return ans;
}

int cnt(vector<int>&v){
  int ans=0;
  for(int i=1;i<=(1<<n);i++)ft[i]=0;
  for(int i=v.size()-1;i>=0;i--){
    ans+=query(v[i]+1);
    update(v[i]+1);
  }
  return ans;
}

typedef pair<int,int> pii;
map<pii,pair<pii,int> > dist;//last move...
int best;
pii hs;
pii hh(vector<int> &v){
  pii ans=make_pair(0,0);
  int a=1,a2=1;
  for(int i=0;i<v.size();i++){
    a*=b;a%=mod;
    a2*=b2;a2%=mod;
    ans.first+=(a*v[i])%mod;
    ans.second+=(a2*v[i])%mod;
  }
  ans.first%=mod;
  ans.second%=mod;
  return ans;
}
int kk;
pii pp;
void dfs(vector<int>&v,pii h){
  kk=cnt(v);
  if(kk<best){
    best=kk;
    hs=h;
  }
  vector<int> v2;
  //move 1:
  for(int i=(1<<(n-1));i<(1<<n);i++)v2.emplace_back(v[i]);
  for(int i=0;i<(1<<(n-1));i++)v2.emplace_back(v[i]);
  pp=hh(v2);
  if(dist.find(pp)==dist.end()){
    dist[pp]=make_pair(h,1);
    dfs(v2,pp);
  }
  v2.clear();

  //move 2:
  for(int i=0;i<(1<<n);i+=2)v2.emplace_back(v[i]);
  for(int i=1;i<(1<<n);i+=2)v2.emplace_back(v[i]);
  pp=hh(v2);
  if(dist.find(pp)==dist.end()){
    dist[pp]=make_pair(h,2);
    dfs(v2,pp);
  }
}
void bt(pii x){
  if(dist[x].second==-1)return;
  bt(dist[x].first);
  cout<<dist[x].second;
}

int32_t main(){
  ios_base::sync_with_stdio(false);cin.tie(0);
  cin>>n;
  vector<int> v;
  for(int i=0;i<(1<<n);i++){
    int a;
    cin>>a;
    v.push_back(a);
  }
  if(n==0){
    cout<<"0\n2\n";
    return 0;
  }
  // if(n>11){main2();return 0;}
  best=1e18;hs=hh(v);
  dist[hs]=make_pair(hs,-1);
  dfs(v,hs);
  cout<<best<<'\n';
  bt(hs);
}

Compilation message (stderr)

cheerleaders.cpp: In function 'pii hh(std::vector<long long int>&)':
cheerleaders.cpp:36:16: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |   for(int i=0;i<v.size();i++){
      |               ~^~~~~~~~~
#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...