Submission #1164187

#TimeUsernameProblemLanguageResultExecution timeMemory
1164187handlebredBoarding Passes (BOI22_passes)C++20
100 / 100
163 ms23124 KiB
#include<bits/stdc++.h>
using namespace std;

#define REP(i,q) for(int i=0; i<(q); ++i)
#define FOR(i,p,q) for(int i=(p); i<=(q); ++i)
#define ROF(i,q,p) for(int i=(q); i>=(p); --i)
#define V vector
#define pb push_back
#define Co const
#define fi first
#define se seconda
#define as assign
#define rz resize
#define all(V) V.begin(), V.end()
#define rall(V) V.rbegin(), V.rend()
#define sz(V) (int)(V.size())
#define ckmin(a,b) a=min(a,b)
#define ckmax(a,b) a=max(a,b)
typedef long double ld;
typedef long long ll;
typedef pair<int,int> pi;
typedef pair<ll,ll> pl;
#ifndef UNCLE
 typedef basic_string<bool> vb;
 typedef basic_string<int> vi;
 typedef basic_string<ll> vl;
#else
 typedef V<bool> vb;
 typedef V<int> vi;
 typedef V<ll> vl;
#endif

constexpr ll INFL=(ll)1e18;
int N,G=0;
V<vi> colVc;

void Input(){
    string s;
    cin>>s;
    N=sz(s);
    colVc.rz(40);
    vi col(40,-1);
    REP(i,N){
        if(col[s[i]-'A']==-1) col[s[i]-'A']=G++;
        colVc[col[s[i]-'A']].pb(i);
    }
}
void Solve(){
    V<V<vl>> qtP(G,V(G,vl())), qtS(G,V(G,vl()));
    REP(g1,G) REP(g2,G) if(g1!=g2){
        int j=0;
        qtP[g1][g2].as(sz(colVc[g2])+1,0), qtS[g1][g2].as(sz(colVc[g2])+1,0);
        REP(i,sz(colVc[g2])){
            while(j<sz(colVc[g1])&&colVc[g1][j]<colVc[g2][i]) ++j;
            qtP[g1][g2][i+1]=qtP[g1][g2][i]+j;
        }
        j=sz(colVc[g1])-1;
        ROF(i,sz(colVc[g2])-1,0){
            while(j>=0&&colVc[g1][j]>colVc[g2][i]) --j;
            qtS[g1][g2][i]=qtS[g1][g2][i+1]+sz(colVc[g1])-j-1;
        }
    }
    vl dp(1<<G,INFL);
    dp[0]=0;
    FOR(cmsk,0,(1<<G)-2){
        REP(gn,G) if(!(cmsk&(1<<gn))){
            int p=0,m,q=sz(colVc[gn])-1;
            auto GtQt=[&](Co int v){
                ll pro=(((ll)v-1)*v+((ll)sz(colVc[gn])-v-1)*(sz(colVc[gn])-v))/2;
                REP(gp,G) if(cmsk&(1<<gp)) pro+=2*(qtP[gp][gn][v]+qtS[gp][gn][v]);
                return pro;
            };
            while(p<=q){
                m=(p+q)/2;
                if(GtQt(m)<GtQt(m+1)) q=m-1;
                else p=m+1;
            }
            m=q+1;
            // ll v=dp[cmsk]+GtQt(m);
            ckmin(dp[cmsk|(1<<gn)],dp[cmsk]+GtQt(m));
        }
    }
    cout<<dp[(1<<G)-1]/2;
    if(dp[(1<<G)-1]&1) cout<<".5";
    cout<<"\n";
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    Input();
    Solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...