Submission #675828

#TimeUsernameProblemLanguageResultExecution timeMemory
675828hotboy2703Cheerleaders (info1cup20_cheerleaders)C++14
100 / 100
1218 ms4180 KiB
#define _GLIBCXX_DEBUG #include<bits/stdc++.h> using namespace std; #define BIT(mask,i) (((mask) >> (i)) & 1LL) #define MASK(i) (1LL<<(i)) long long h[200100]; long long n; long long a[200100]; long long BIT[(1LL<<17) + 5]; void update(long long x,long long val){ for (;x<=(1LL<<17);x+=x&-x)BIT[x]+=val; } long long get(long long x){ long long res = 0; for (;x > 0;x -= x &-x)res += BIT[x]; return res; } pair <long long,long long> solve(){ long long res = 0; long long id = 0; for (long long i = n - 1LL;i >= 0;i --){ long long inversion = 0; for (long long j = 0;j < (1LL<<(n-1LL-i));j ++){ for (long long k = 0;k < (1LL<<i);k ++){ update(a[(j<<(i+1LL)) + (1LL<<i) + k] + 1LL,1LL); } for (long long k = 0;k < (1LL<<i);k ++){ inversion += get(a[(j<<(i+1LL)) + k]); } for (long long k = 0;k < (1LL<<i);k ++){ update(a[(j<<(i+1LL)) + (1<<i) + k] + 1LL,-1LL); } } if ((1LL<<(n-1LL+i)) - inversion < inversion){ id ^= (1LL<<i); } res += min((1LL<<(n-1LL+i)) - inversion , inversion); } return {res,id}; } int main(){ ios_base::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr); //freopen("DUMB.INP","r",stdin); //freopen("DUMB.out","w",stdout); cin>>n; for (long long i = 0;i < (1LL<<n);i ++)cin>>h[i]; if (n == 0){ cout<<0<<'\n'; return 0; } long long ans = LLONG_MAX; pair <long long, long long> trace; for (long long i = n - 1LL;i >= 0;i --){ for (long long mask = 0;mask < MASK(n);mask++){ long long cur = i; long long real_mask = 0; for (long long k = n - 1LL;k >= 0;k --){ real_mask ^= (BIT(mask,k)<<cur); cur--; if (cur < 0)cur = n - 1LL; } a[mask] = h[real_mask]; } pair <long long,long long> tmp = solve(); if (tmp.first < ans){ ans = tmp.first; trace.first = i; trace.second = tmp.second; } } cout<<ans<<'\n'; for (long long i = 0;i < (trace.first - n + 1LL + n) % n;i++)cout<<2; int cur = n - 1LL; for (long long i = n - 1LL;i >= 0;i--){ if (BIT(trace.second,cur))cout<<1LL; cout<<2; cur ++; cur %= n; } 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...