Submission #1188604

#TimeUsernameProblemLanguageResultExecution timeMemory
1188604qwushaBoarding Passes (BOI22_passes)C++20
60 / 100
248 ms888 KiB
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
typedef long long ll;
typedef long double ld;
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
#define int long long
int inf = 1e18;
#define ld long double

signed main() {
    string s;
    cin >> s;
    int n = s.size();
    set<char> st;
    for (auto el : s)
        st.insert(el);
    if(st.size() == 1) {
        ld res = 0;
        for (int i = 0; i < n / 2; i++) {
            res += i;
        }
        for (int i = n - 1; i >= n / 2; i--) {
            res += (n - 1 - i);
        }
        res /= 2;
        cout << setprecision(15) << res << '\n';
        return 0;
    }
    vector<int> a(n);
    int k = 10;
    vector<int> cnt(k);
    vector<vector<int>> pos(k);
    for(int i = 0; i < n; i++)  {
        a[i] = s[i] - 'A';
        cnt[a[i]]++;
        pos[a[i]].push_back(i);
    }
    vector<int> sum(n + 1);
    for (int i = 1; i < n + 1; i++) {
        sum[i] = sum[i - 1] + i - 1;
    }
    vector<int> dp((1 << k), inf);
    dp[0] = 0;
    vector<int> pref(n + 1), suf(n + 1);
    for (int ma = 1; ma < (1 << k); ma++) {
        vector<int> vec;
        for (int i = 0; i < k; i++) {
            if ((ma >> i) & 1) {
                vec.push_back(i);
            }
        }
        for (auto el : vec) {
            int par = ma - (1 << el);
            for (int i = 0; i < n; i++) {
                pref[i + 1] = pref[i];
                if ((par >> (a[i])) & 1) {
                    pref[i + 1] += 2;
                }
            }
            int suffi = 0, preffi = 0;
            for (int i = n - 1; i >= 0; i--) {
                suf[i] = suf[i + 1];
                if ((par >> (a[i])) & 1) {
                    suf[i] += 2;
                }
            }
            for (auto in : pos[el])
                suffi += suf[in];
            int mini = suffi + sum[cnt[el]];
            for (int i = 0; i < cnt[el]; i++) {
                int indi = pos[el][i];
                preffi += pref[indi + 1];
                suffi -= suf[indi];
                mini = min(mini, sum[i + 1] + sum[cnt[el] - (i + 1)] + preffi + suffi);
            }
            if (cnt[el] == 0) {
                dp[ma] = min(dp[ma], dp[par]);
            } else {
                dp[ma] = min(dp[ma], dp[par] + mini);
            }
        }
    }
    cout << setprecision(30) << (ld)dp[dp.size() - 1] / (ld)2 << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...