Submission #674218

#TimeUsernameProblemLanguageResultExecution timeMemory
674218stanislavpolynBoarding Passes (BOI22_passes)C++17
25 / 100
2 ms1620 KiB
#include <bits/stdc++.h> #define fr(i, a, b) for (int i = (a); i <= (b); ++i) #define rf(i, a, b) for (int i = (a); i >= (b); --i) #define fe(x, y) for (auto& x : y) #define fi first #define se second #define pb push_back #define mp make_pair #define mt make_tuple #define all(x) (x).begin(), (x).end() #define pw(x) (1LL << (x)) #define sz(x) (int)(x).size() using namespace std; mt19937_64 rng(228); #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; template <typename T> using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; #define fbo find_by_order #define ook order_of_key template <typename T> bool umn(T& a, T b) { return a > b ? a = b, 1 : 0; } template <typename T> bool umx(T& a, T b) { return a < b ? a = b, 1 : 0; } using ll = long long; using ld = long double; using pii = pair<int, int>; using pll = pair<ll, ll>; template <typename T> using ve = vector<T>; const int N = 1e5 + 5; string s; ve<int> v[26]; ld dp[pw(16)]; int pref[N][16]; int suff[N][16]; ve<int> p; ld calc(int mask, int i) { ld sum = 0; int l = 0; // cout << "WTF " << i << "\n"; fe (x, v[i]) { ld val1 = 0; ld val2 = 0; fr (i, 0, 15) { if (mask & pw(i)) { val1 += pref[x][p[i]]; val2 += suff[x][p[i]]; } } val1 += 0.5 * l; val2 += 0.5 * (sz(v[i]) - 1 - l); // cout << val1 << " " << val2 << "\n"; sum += min(val1, val2); l++; } return sum; } int main() { #ifdef LOCAL freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #else ios::sync_with_stdio(0); cin.tie(0); #endif cin >> s; // fr (i, 1, 899) s.pb('A'); fr (i, 0, sz(s) - 1) { v[s[i] - 'A'].pb(i); } fr (i, 0, sz(s) - 1) { pref[i][s[i] - 'A'] = 1; if (i > 0) { fr (j, 0, 15) { pref[i][j] += pref[i - 1][j]; } } } rf (i, sz(s) - 1, 0) { suff[i][s[i] - 'A'] = 1; if (i + 1 < sz(s)) { fr (j, 0, 15) { suff[i][j] += suff[i + 1][j]; } } } fr (i, 0, 25) { if (sz(v[i])) { p.pb(i); } } // fe (x, p) { // cout << char(x + 'A') << "\n"; // } // // cout << calc(1, 1) << "\n"; // return 0; fr (mask, 0, pw(sz(p)) - 1) { dp[mask] = 1e18; } dp[0] = 0; fr (mask, 0, pw(sz(p)) - 1) { fr (i, 0, sz(p) - 1) { if (!(mask & pw(i))) { umn(dp[mask | pw(i)], dp[mask] + calc(mask, p[i])); } } } cout << dp[pw(sz(p)) - 1] << "\n"; // ld res = 1e18; // ve<bool> act(sz(s)); // ve<int> P(sz(s)); // ve<int> S(sz(s)); // ve<int> SS(sz(s)); // ve<int> PP(sz(s)); // // do { // fill(all(act), 0); // fill(all(P), 0); // fill(all(PP), 0); // fill(all(S), 0); // fill(all(SS), 0); // ld ans = 0; // // fe (x, p) { // // fr (i, 0, sz(v[x]) - 1) { // PP[i] = P[v[x][i]]; // if (i > 0) PP[i] += PP[i - 1]; // } // rf (i, sz(v[x]) - 1, 0) { // SS[i] = S[v[x][i]]; // if (i + 1 < sz(v[x])) SS[i] += SS[i + 1]; // } // // ld best = 1e18; //// //// { //// ld now = 0; //// fr (i, 0, sz(v[x]) - 1) { //// ld val1 = P[v[x][i]] + i * 0.5; //// ld val2 = S[v[x][i]] + (sz(v[x]) - 1 - i) * 0.5; //// now += min(val1, val2); //// } //// umn(best, now); //// } // // fr (pref, 0, sz(v[x])) { // ld now = 0; // if (pref - 1 >= 0) now += PP[pref - 1]; // if (pref < sz(v[x])) now += SS[pref]; //// fr (i, 0, pref - 1) { //// now += P[v[x][i]]; //// } //// fr (i, pref, sz(v[x]) - 1) { //// now += S[v[x][i]]; //// } // // now += ld(0.5) * pref * (pref - 1) / 2; // int suff = sz(v[x]) - pref; // now += ld(0.5) * suff * (suff - 1) / 2; // //// if (abs(now - 2) <= 1e-7) { //// cout << pref << " " << suff << "\n"; //// } // // umn(best, now); // } // fe (cur, v[x]) act[cur] = 1; // // fr (i, 0, sz(s) - 1) { // P[i] = act[i]; // if (i > 0) P[i] += P[i - 1]; // } // rf (i, sz(s) - 1, 0) { // S[i] = act[i]; // if (i + 1 < sz(s)) { // S[i] += S[i + 1]; // } // } //// cout << "Add " << best << " " << char(x + 'A') << "\n"; // ans += best; // } //// cout << "\n"; // umn(res, ans); // } while (next_permutation(all(p))); // // cout << fixed << setprecision(10) << res << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...