# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
921281 | 2024-02-03T16:07:41 Z | themm1 | Boarding Passes (BOI22_passes) | C++17 | 9 ms | 2372 KB |
#include <bits/stdc++.h> using namespace std; // ordered set whith s.order_of_key(x) method, which returns rank of element x in set s /* #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set; */ // pair printing template <class T, class U> ostream& operator<<(ostream& out, const pair<T, U> &par) {out << "(" << par.first << "; " << par.second << ")"; return out;} // set printing template <class T> ostream& operator<<(ostream& out, const set<T> &cont) { out << "{"; for(const auto &x:cont) out << x << ", "; out << "}"; return out; } // map printing template <class T, class U> ostream& operator<<(ostream& out, const map<T, U> &cont) {out << "{"; for(const auto &x:cont) out << x << ", "; out << "}"; return out; } // unordered_set printing template <class T> ostream& operator<<(ostream& out, const unordered_set<T> &cont) {out << "{";for(const auto &x:cont) out << x << ", ";out << "}";return out;} // unordered_map printing template <class T, class U> ostream& operator<<(ostream& out, const unordered_map<T, U> &cont) {out << "{";for(const auto &x:cont) out << x << ", ";out << "}";return out;} // vector printing template<class T> ostream& operator<<(ostream& out, const vector<T> &cont){ out << "["; for (const auto &x:cont) out << x << ", "; out << "]"; return out;} #define print(x) cout << (x) << endl; #define dmp(x) cerr << #x << " = " << x << endl #define dmpn(x) cerr << #x << " = " << x << "; " #define dmpl(x) cerr << "Line " << __LINE__ << ": " << #x << " = " << x << endl using ll = long long; using ld = long double; using pii = pair<int, int>; using pll = pair<ll, ll>; #define pb push_back #define ff first #define ss second #define all(x) begin(x), end(x) #define sz(x) (int)x.size() #define contains(s,x) ((s).find(x) != (s).end()) const int MOD = 998244353; bool ith_bit(int x, int i) { int y = (1 << i); return (x ^ y) < x; } void print_bits(int x) { bitset<8> bx = x; cout << bx << endl; } vector<int> transform_input(string &s) { vector<int> mapping(26, -1); int cnt = 0; vector<int> a(sz(s), -1); for (int i = 0; i < sz(s); i++) { if (mapping[s[i] - 'A'] == -1) { mapping[s[i] - 'A'] = cnt; cnt++; } a[i] = mapping[s[i] - 'A']; } return a; } void solve() { string s; cin >> s; int N = sz(s); vector<int> arr = transform_input(s); int M = *max_element(all(arr)) + 1, M2 = (1 << M); vector<vector<int>> indices(M, vector<int>({-1})); for (int i = 0; i < N; i++) indices[arr[i]].pb(i); for (int k = 0; k < M; k++) indices[k].pb(N); vector<vector<int>> psums(M, vector<int>(N + 1, 0)); vector<vector<int>> pref_vals(M, vector<int>(N + 1, 0)), suff_vals(M, vector<int>(N + 1, 0)); for (int k = 0; k < M; k++) { for (int i = 0; i < N; i++) { psums[k][i + 1] = psums[k][i] + (arr[i] == k); } vector<int> last_vals(M, 0); for (int i = 0; i < N; i++) { if (arr[i] != k) { last_vals[arr[i]] += psums[k][i]; pref_vals[k][i + 1] = last_vals[arr[i]]; } } last_vals.assign(M, 0); for (int i = N - 1; i >= 0; i--) { if (arr[i] != k) { last_vals[arr[i]] += psums[k][N] - psums[k][i]; suff_vals[k][i] = last_vals[arr[i]]; } } // dmpn(k); dmp(suff_vals[k]); } auto func = [&](int i, int j, int mask) { ld pref = 0, suff = 0; if (i >= 0) { int pref_cnt = psums[arr[i]][i + 1]; pref = (ld)(pref_cnt * (pref_cnt - 1)) / (ld)4; } if (j < N) { int suff_cnt = psums[arr[j]][N] - psums[arr[j]][j]; suff = (ld)(suff_cnt * (suff_cnt - 1)) / (ld)4; } for (int k = 0; k < M; k++) if (ith_bit(mask, k)) { if (i >= 0) pref += pref_vals[k][i + 1]; if (j < N) suff += suff_vals[k][j]; } return pref + suff; }; vector<ld> dp(M2, N * N); dp[0] = 0; for (int mask = 1; mask < M2; mask++) { // print_bits(mask); for (int k = 0; k < M; k++) if (ith_bit(mask, k) == 1) { int pmask = mask ^ (1 << k); int lo = 0, hi = sz(indices[k]) - 1; while (hi - lo > 2) { int mid1 = lo + (hi - lo) / 3; int mid2 = hi - (hi - lo) / 3; ld f1 = func(indices[k][mid1], indices[k][mid1 + 1], pmask); ld f2 = func(indices[k][mid2], indices[k][mid2 + 1], pmask); if (f1 > f2) lo = mid1; else hi = mid2; } ld curr = N * N; for (int mid = lo; mid < hi; mid++) curr = min(curr, func(indices[k][mid], indices[k][mid + 1], pmask)); ld val = dp[pmask] + curr; dp[mask] = min(dp[mask], val); } } ld ans = dp[M2 - 1]; cout << ans << endl; } int32_t main() { ios::sync_with_stdio(false); cout << setprecision(12); cin.tie(0); cout.tie(0); int t = 1; // cin >> t; while (t--) { solve(); } }
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 0 ms | 344 KB | found '100800.5000000000', expected '100800.5000000000', error '0.0000000000' |
2 | Correct | 1 ms | 348 KB | found '0.0000000000', expected '0.0000000000', error '-0.0000000000' |
3 | Correct | 1 ms | 344 KB | found '0.0000000000', expected '0.0000000000', error '-0.0000000000' |
4 | Correct | 0 ms | 348 KB | found '1.0000000000', expected '1.0000000000', error '0.0000000000' |
5 | Correct | 1 ms | 348 KB | found '124002.0000000000', expected '124002.0000000000', error '0.0000000000' |
6 | Incorrect | 2 ms | 2372 KB | 1st numbers differ - expected: '772893586.0000000000', found: '-276172925.5000000000', error = '1.3573233502' |
7 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 0 ms | 348 KB | found '1.0000000000', expected '1.0000000000', error '0.0000000000' |
2 | Correct | 0 ms | 348 KB | found '1225.0000000000', expected '1225.0000000000', error '0.0000000000' |
3 | Correct | 1 ms | 344 KB | found '1023.0000000000', expected '1023.0000000000', error '0.0000000000' |
4 | Correct | 1 ms | 348 KB | found '294.0000000000', expected '294.0000000000', error '0.0000000000' |
5 | Correct | 1 ms | 348 KB | found '1087.0000000000', expected '1087.0000000000', error '0.0000000000' |
6 | Correct | 0 ms | 348 KB | found '1.5000000000', expected '1.5000000000', error '0.0000000000' |
7 | Correct | 0 ms | 348 KB | found '703.0000000000', expected '703.0000000000', error '0.0000000000' |
8 | Correct | 1 ms | 348 KB | found '55.5000000000', expected '55.5000000000', error '0.0000000000' |
9 | Correct | 1 ms | 348 KB | found '56.0000000000', expected '56.0000000000', error '0.0000000000' |
10 | Correct | 1 ms | 348 KB | found '45.0000000000', expected '45.0000000000', error '0.0000000000' |
11 | Correct | 0 ms | 348 KB | found '66.5000000000', expected '66.5000000000', error '0.0000000000' |
12 | Correct | 1 ms | 348 KB | found '67.0000000000', expected '67.0000000000', error '0.0000000000' |
13 | Correct | 1 ms | 344 KB | found '66.0000000000', expected '66.0000000000', error '0.0000000000' |
14 | Correct | 1 ms | 348 KB | found '47.0000000000', expected '47.0000000000', error '0.0000000000' |
15 | Correct | 1 ms | 348 KB | found '50.0000000000', expected '50.0000000000', error '0.0000000000' |
16 | Correct | 1 ms | 348 KB | found '49.0000000000', expected '49.0000000000', error '0.0000000000' |
17 | Correct | 1 ms | 348 KB | found '57.0000000000', expected '57.0000000000', error '0.0000000000' |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 0 ms | 348 KB | found '1.0000000000', expected '1.0000000000', error '0.0000000000' |
2 | Correct | 0 ms | 348 KB | found '1225.0000000000', expected '1225.0000000000', error '0.0000000000' |
3 | Correct | 1 ms | 344 KB | found '1023.0000000000', expected '1023.0000000000', error '0.0000000000' |
4 | Correct | 1 ms | 348 KB | found '294.0000000000', expected '294.0000000000', error '0.0000000000' |
5 | Correct | 1 ms | 348 KB | found '1087.0000000000', expected '1087.0000000000', error '0.0000000000' |
6 | Correct | 0 ms | 348 KB | found '1.5000000000', expected '1.5000000000', error '0.0000000000' |
7 | Correct | 0 ms | 348 KB | found '703.0000000000', expected '703.0000000000', error '0.0000000000' |
8 | Correct | 1 ms | 348 KB | found '55.5000000000', expected '55.5000000000', error '0.0000000000' |
9 | Correct | 1 ms | 348 KB | found '56.0000000000', expected '56.0000000000', error '0.0000000000' |
10 | Correct | 1 ms | 348 KB | found '45.0000000000', expected '45.0000000000', error '0.0000000000' |
11 | Correct | 0 ms | 348 KB | found '66.5000000000', expected '66.5000000000', error '0.0000000000' |
12 | Correct | 1 ms | 348 KB | found '67.0000000000', expected '67.0000000000', error '0.0000000000' |
13 | Correct | 1 ms | 344 KB | found '66.0000000000', expected '66.0000000000', error '0.0000000000' |
14 | Correct | 1 ms | 348 KB | found '47.0000000000', expected '47.0000000000', error '0.0000000000' |
15 | Correct | 1 ms | 348 KB | found '50.0000000000', expected '50.0000000000', error '0.0000000000' |
16 | Correct | 1 ms | 348 KB | found '49.0000000000', expected '49.0000000000', error '0.0000000000' |
17 | Correct | 1 ms | 348 KB | found '57.0000000000', expected '57.0000000000', error '0.0000000000' |
18 | Correct | 1 ms | 348 KB | found '1.0000000000', expected '1.0000000000', error '0.0000000000' |
19 | Correct | 0 ms | 456 KB | found '1225.0000000000', expected '1225.0000000000', error '0.0000000000' |
20 | Correct | 1 ms | 348 KB | found '1023.0000000000', expected '1023.0000000000', error '0.0000000000' |
21 | Correct | 1 ms | 348 KB | found '294.0000000000', expected '294.0000000000', error '0.0000000000' |
22 | Correct | 0 ms | 348 KB | found '1087.0000000000', expected '1087.0000000000', error '0.0000000000' |
23 | Correct | 0 ms | 348 KB | found '1.5000000000', expected '1.5000000000', error '0.0000000000' |
24 | Correct | 1 ms | 348 KB | found '703.0000000000', expected '703.0000000000', error '0.0000000000' |
25 | Correct | 1 ms | 348 KB | found '55.5000000000', expected '55.5000000000', error '0.0000000000' |
26 | Correct | 1 ms | 348 KB | found '56.0000000000', expected '56.0000000000', error '0.0000000000' |
27 | Correct | 1 ms | 348 KB | found '45.0000000000', expected '45.0000000000', error '0.0000000000' |
28 | Correct | 1 ms | 348 KB | found '66.5000000000', expected '66.5000000000', error '0.0000000000' |
29 | Correct | 0 ms | 348 KB | found '67.0000000000', expected '67.0000000000', error '0.0000000000' |
30 | Correct | 1 ms | 348 KB | found '66.0000000000', expected '66.0000000000', error '0.0000000000' |
31 | Correct | 1 ms | 448 KB | found '47.0000000000', expected '47.0000000000', error '0.0000000000' |
32 | Correct | 1 ms | 344 KB | found '50.0000000000', expected '50.0000000000', error '0.0000000000' |
33 | Correct | 1 ms | 348 KB | found '49.0000000000', expected '49.0000000000', error '0.0000000000' |
34 | Correct | 1 ms | 348 KB | found '57.0000000000', expected '57.0000000000', error '0.0000000000' |
35 | Correct | 1 ms | 680 KB | found '12497500.0000000000', expected '12497500.0000000000', error '0.0000000000' |
36 | Correct | 1 ms | 604 KB | found '12495000.5000000000', expected '12495000.5000000000', error '0.0000000000' |
37 | Correct | 7 ms | 1628 KB | found '12223392.0000000000', expected '12223392.0000000000', error '0.0000000000' |
38 | Correct | 6 ms | 1624 KB | found '2372500.0000000000', expected '2372500.0000000000', error '0.0000000000' |
39 | Correct | 3 ms | 1624 KB | found '12475017.5000000000', expected '12475017.5000000000', error '0.0000000000' |
40 | Correct | 7 ms | 1624 KB | found '10655706.0000000000', expected '10655706.0000000000', error '0.0000000000' |
41 | Correct | 7 ms | 1628 KB | found '11977895.5000000000', expected '11977895.5000000000', error '0.0000000000' |
42 | Correct | 9 ms | 1656 KB | found '11977865.0000000000', expected '11977865.0000000000', error '0.0000000000' |
43 | Correct | 7 ms | 1628 KB | found '11977907.5000000000', expected '11977907.5000000000', error '0.0000000000' |
44 | Correct | 7 ms | 1628 KB | found '11977808.0000000000', expected '11977808.0000000000', error '0.0000000000' |
45 | Correct | 7 ms | 1628 KB | found '11977791.0000000000', expected '11977791.0000000000', error '0.0000000000' |
46 | Correct | 7 ms | 1628 KB | found '11977871.5000000000', expected '11977871.5000000000', error '0.0000000000' |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 0 ms | 344 KB | found '100800.5000000000', expected '100800.5000000000', error '0.0000000000' |
2 | Correct | 1 ms | 348 KB | found '0.0000000000', expected '0.0000000000', error '-0.0000000000' |
3 | Correct | 1 ms | 344 KB | found '0.0000000000', expected '0.0000000000', error '-0.0000000000' |
4 | Correct | 0 ms | 348 KB | found '1.0000000000', expected '1.0000000000', error '0.0000000000' |
5 | Correct | 1 ms | 348 KB | found '124002.0000000000', expected '124002.0000000000', error '0.0000000000' |
6 | Incorrect | 2 ms | 2372 KB | 1st numbers differ - expected: '772893586.0000000000', found: '-276172925.5000000000', error = '1.3573233502' |
7 | Halted | 0 ms | 0 KB | - |