제출 #1188585

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