답안 #921281

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
921281 2024-02-03T16:07:41 Z themm1 Boarding Passes (BOI22_passes) C++17
55 / 100
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 -