제출 #740329

#제출 시각아이디문제언어결과실행 시간메모리
740329stevancvBoarding Passes (BOI22_passes)C++14
100 / 100
240 ms23436 KiB
#include <bits/stdc++.h> #define ll long long #define ld long double #define sp ' ' #define en '\n' #define smin(a, b) a = min(a, b) #define smax(a, b) a = max(a, b) using namespace std; const int N = 1e5 + 2; const int M = 15; const int K = 1 << M; const ll linf = 1e18; vector<ll> pref[M][M], suff[M][M]; vector<int> pos[M]; ll dp[K]; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); string s; cin >> s; int n = s.size(); for (int i = 0; i < n; i++) pos[s[i] - 'A'].push_back(i); for (int i = 0; i < M; i++) { for (int j = 0; j < M; j++) { if (i == j) continue; pref[i][j].resize(pos[i].size()); int jj = 0; for (int ii = 0; ii < pos[i].size(); ii++) { while (jj < pos[j].size() && pos[j][jj] < pos[i][ii]) jj += 1; pref[i][j][ii] = 2 * jj; if (ii > 0) pref[i][j][ii] += pref[i][j][ii - 1]; } } } for (int i = 0; i < M; i++) { for (int j = 0; j < M; j++) { if (i == j) continue; suff[i][j].resize(pos[i].size()); int jj = pos[j].size() - 1; for (int ii = pos[i].size() - 1; ii >= 0; ii--) { while (jj >= 0 && pos[j][jj] > pos[i][ii]) jj -= 1; suff[i][j][ii] = 2 * (pos[j].size() - jj - 1); if (ii < pos[i].size() - 1) suff[i][j][ii] += suff[i][j][ii + 1]; } } } for (int mask = 1; mask < K; mask++) { dp[mask] = linf; for (int i = 0; i < M; i++) { if (!((1 << i) & mask)) continue; int uk = pos[i].size(); auto F = [&] (ll kol) { ll ans = kol * (kol - 1) / 2; ans += (uk - kol) * (uk - kol - 1) / 2; for (int j = 0; j < M; j++) { if (i != j && ((1 << j) & mask)) { if (kol > 0) ans += pref[i][j][kol - 1]; if (kol < uk) ans += suff[i][j][kol]; } } return ans; }; int l = 0, r = uk - 1, gde = uk; while (l <= r) { int mid = l + r >> 1; if (F(mid) < F(mid + 1)) { gde = mid; r = mid - 1; } else l = mid + 1; } smin(dp[mask], dp[mask ^ (1 << i)] + F(gde)); } } cout << dp[K - 1] / 2; if (dp[K - 1] % 2 == 1) cout << ".5" << en; return 0; }

컴파일 시 표준 에러 (stderr) 메시지

passes.cpp: In function 'int main()':
passes.cpp:28:33: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   28 |             for (int ii = 0; ii < pos[i].size(); ii++) {
      |                              ~~~^~~~~~~~~~~~~~~
passes.cpp:29:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |                 while (jj < pos[j].size() && pos[j][jj] < pos[i][ii]) jj += 1;
      |                        ~~~^~~~~~~~~~~~~~~
passes.cpp:43:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |                 if (ii < pos[i].size() - 1) suff[i][j][ii] += suff[i][j][ii + 1];
      |                     ~~~^~~~~~~~~~~~~~~~~~~
passes.cpp:65:29: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   65 |                 int mid = l + r >> 1;
      |                           ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...