Submission #1256407

#TimeUsernameProblemLanguageResultExecution timeMemory
1256407BigBadBullyBoarding Passes (BOI22_passes)C++20
60 / 100
2095 ms1604 KiB
#include <bits/stdc++.h>
#define int long long
#define pii pair<int, int>
#define ff first
#define ss second
using namespace std;
const int inf = 1e18 + 5;
const int mod = 1e9 + 7;
const int maxm = 5e6 + 1;
const pii bad = {inf, inf};
using ll = long long;
using ld = long double;

int calc(ld x)
{
    if(x==0)return 0;
    return x*(x-1)/2;
}

void solve()
{
    string s;
    cin >> s;
    int n = s.length();
    int g = 0;
    vector<int> cs;
    vector<int> ord('Z' + 1, -1);
    {
        vector<int> vis('Z' + 1, 1);
        for (char c : s)
        {
            if (vis[c])
                cs.push_back(c),ord[c]=g;
            g += vis[c], vis[c] = 0;
        }
    }
    vector<int> v(n);
    for (int i = 0; i < n; i++)
        v[i] = ord[s[i]];
    vector<int> dp((1 << g), inf);
    dp[0] = 0;
    for (int mask = 1; mask < (1 << g); mask++)
    {
        int tu = 0;
        vector<int> cnt(g, 0), lef(g, 0),viden(g,0),dobri(g,0);
        for (int i = 0; i < n; i++)
            if ((mask & (1 << v[i])) > 0)
                tu++;
        {
            int r = 0;
            for (int i = n-1; i >= 0; i--)
                if ((mask & (1 << v[i])) > 0)
                    cnt[v[i]] += r-dobri[v[i]],r++,dobri[v[i]]++;
        }
        int l = 0;
        for (int i = 0; i < n; i++)
            if ((mask & (1 << v[i])) > 0)
            {
                dp[mask] = min(dp[mask], dp[mask ^ (1 << v[i])] + 
                calc(viden[v[i]])+calc(dobri[v[i]]-viden[v[i]]) +
                2*(lef[v[i]]+cnt[v[i]]));

                lef[v[i]]+=l-viden[v[i]];
                cnt[v[i]]-=(tu-l)-(dobri[v[i]]-viden[v[i]]);
                viden[v[i]]++;
                l++;

                dp[mask] = min(dp[mask], dp[mask ^ (1 << v[i])] + 
                calc(viden[v[i]])+calc(dobri[v[i]]-viden[v[i]]) +
                2*(lef[v[i]]+cnt[v[i]]));
            }
    }
    cout << dp[(1<<g)-1]/2 << (dp[(1<<g)-1]%2?".5":"") << '\n';
}

signed main()
{

    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    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...