제출 #1188609

#제출 시각아이디문제언어결과실행 시간메모리
1188609qwushaBoarding Passes (BOI22_passes)C++20
25 / 100
2095 ms21588 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 = 15; 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<vector<int>> pref(k, vector<int>(n + 1)), suf(k, vector<int>(n + 1)); for (int i = 0; i < k; i++) { for (int j = 0; j < n; j++) { pref[i][j + 1] = pref[i][j]; if (a[j] == i) pref[i][j + 1] += 2; } for (int j = n - 1; j >= 0; j--) { suf[i][j] = suf[i][j + 1]; if (a[j] == i) suf[i][j] += 2; } } 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); int suffi = 0, preffi = 0; for (auto in : pos[el]) { for (auto ot : vec) { if (ot != el) { suffi += suf[ot][in]; } } } int mini = suffi + sum[cnt[el]]; for (int i = 0; i < cnt[el]; i++) { int indi = pos[el][i]; for (auto ot : vec) { if (ot != el) { preffi += pref[ot][indi + 1]; suffi -= suf[ot][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...