Submission #1188585

#TimeUsernameProblemLanguageResultExecution timeMemory
1188585qwushaBoarding Passes (BOI22_passes)C++20
0 / 100
2075 ms4632 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();
    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;
    }
    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 ind = pos[el].size() - 1;
            int suffi = 0, preffi = 0;
            for (int i = n - 1; i >= 0; i--) {
                if (ind > 0 && pos[el][ind] > i)
                    ind--;
                suf[i] = suf[i + 1];
                if ((par >> (a[i])) & 1) {
                    suf[i] += 2;
                }
                if (ind >= 0 && pos[el][ind] == i)
                    suffi += suf[i];
            }
            int mini = suffi + sum[cnt[el] - 1];
            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] + sum[cnt[el] - 1 - (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(15) << (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...