# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1028134 | 2024-07-19T14:17:21 Z | anango | Boarding Passes (BOI22_passes) | C++17 | 1 ms | 604 KB |
#include <bits/stdc++.h> #define int long long using namespace std; int INF = 1LL<<30; void solve() { string S; cin >> S; int n = S.size(); vector<int> ar(n); for (int i=0; i<n; i++) ar[i] = (S[i]-'A'); int G = 15; int pref[n+1][G]; //count of character c, before index i int suff[n+1][G]; //count of character c, after or equal to index i for (int i=0; i<=n; i++) { for (int j=0; j<G; j++) { pref[i][j] = suff[i][j] = 0; } } for (int i=0; i<n; i++) { for (int j=0; j<=G; j++) { if (j==ar[i]) { pref[i+1][j] = pref[i][j]+1; } else { pref[i+1][j] = pref[i][j]; } } } for (int i=n-1; i>=0; i--) { for (int j=0; j<G; j++) { if (j==ar[i]) { suff[i][j] = suff[i+1][j]+1; } else { suff[i][j] = suff[i+1][j]; } } } //everyone before L boards from the front, everyone after or equal to it boards from the back. vector<vector<int>> counts(G,vector<int>(G,0)); //counts[i][j] = sum of subsequences of (i,j) before l, and subsequences of (j,i) after L //counts[i][j] = sum of pref[k][j] for k<=L and ar[k]=i, and analogous expression for the suffix //first, get initial count values (for everyone boarding from the back) for (int j=0; j<G; j++) { for (int k=0; k<n; k++) { int i = ar[k]; //cout << "adding " << i <<" " << j <<" " << k <<" " << j << " " << suff[k][j] << endl; counts[i][j] += suff[k+1][j]; } } /*for (int i=0; i<G; i++) { for (int j=0; j<G; j++) { cout << i <<" " << j <<" " << counts[i][j] << endl; } }*/ int ans = 1LL<<62; for (int L=0; L<n; L++) { vector<int> grps(G); for (int j=0; j<G; j++) grps[j] = j; sort(grps.begin(), grps.end(), [&](const int i1, const int i2) { return counts[i1][i2]>counts[i2][i1]; }); int su=0; for (int i=0; i<G; i++) { for (int j=0; j<i; j++) { su+=counts[grps[i]][grps[j]]; } } int self = 0; for (int i=0; i<G; i++) { self+=counts[i][i]; } //cout << L <<" " << su <<" " << self << " " << grps[0] <<" " << grps[1] <<" " << grps[2] << endl; ans=min(ans,su*2+self); //transfer L to the right int cur = ar[L]; for (int j=0; j<G; j++) { int delta = suff[L+1][j]; int delta2 = pref[L][j]; counts[cur][j] -= delta-delta2; } /*cout << "TRANSFERRED TO " << L+1 << endl; for (int i=0; i<G; i++) { for (int j=0; j<G; j++) { cout << i <<" " << j <<" " << counts[i][j] << endl; } } cout << endl;*/ } long double a2 = ans; a2/=2; cout << a2 << endl; } signed main() { int local=0; if (local) { // for getting input from input.txt freopen("input.txt", "r", stdin); // for writing output to output.txt freopen("output.txt", "w", stdout); } /*#ifdef ONLINE_JUDGE ios_base::sync_with_stdio(false); cin.tie(NULL); #endif*/ //fast IO solve(); }
Compilation message
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 1 ms | 604 KB | 1st numbers differ - expected: '100800.5000000000', found: '100800.0000000000', error = '0.0000049603' |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 0 ms | 344 KB | found '1.0000000000', expected '1.0000000000', error '0.0000000000' |
2 | Correct | 0 ms | 384 KB | found '1225.0000000000', expected '1225.0000000000', error '0.0000000000' |
3 | Incorrect | 0 ms | 344 KB | 1st numbers differ - expected: '1023.0000000000', found: '1023.5000000000', error = '0.0004887586' |
4 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 0 ms | 344 KB | found '1.0000000000', expected '1.0000000000', error '0.0000000000' |
2 | Correct | 0 ms | 384 KB | found '1225.0000000000', expected '1225.0000000000', error '0.0000000000' |
3 | Incorrect | 0 ms | 344 KB | 1st numbers differ - expected: '1023.0000000000', found: '1023.5000000000', error = '0.0004887586' |
4 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 1 ms | 604 KB | 1st numbers differ - expected: '100800.5000000000', found: '100800.0000000000', error = '0.0000049603' |
2 | Halted | 0 ms | 0 KB | - |