제출 #1256407

#제출 시각아이디문제언어결과실행 시간메모리
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...