Submission #963071

#TimeUsernameProblemLanguageResultExecution timeMemory
963071RaresFelixChorus (JOI23_chorus)C++17
100 / 100
1045 ms99460 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3") #pragma GCC target("avx,avx2,fma") #define sz(x) int((x).size()) #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() using namespace std; using ll = long long; using ld = long double; // or double, if TL is tight using str = string; using ii = pair<int, int>; using pl = pair<ll, ll>; using vi = vector<int>; using vll = vector<ll>; const ll INF = 1e18; struct CHT { int p = 0; vector<tuple<ll, ll, int> > V; void insert(ll a, ll b, int cnt) { /// ax + b //a va scadea mereu while(V.size() > 1) { auto [a1, b1, c1] = V.end()[-1]; auto [a2, b2, c2] = V.end()[-2]; if((b2 - b) * (a1 - a2) <= (b2 - b1) * (a - a2)) { V.pop_back(); p = min(p, int(V.size()) - 1); } else break; } V.push_back({a, b, cnt}); } pair<ll, int> query(ll x) { if(V.empty()) return {INF, 0}; ll re = INF; auto eval = [&](int i) -> ll { return get<0>(V[i]) * x + get<1>(V[i]); }; while(p + 1 < V.size() && eval(p + 1) < eval(p)) ++p; return make_pair(eval(p), get<2>(V[p])); } }; int main() { cin.tie(0); ios_base::sync_with_stdio(0); int n, k; cin >> n >> k; string s0, s; cin >> s0; ll re0 = 0; int nrB = 0, sum = 0; for(auto it : s0) { if(it == 'A') { ++sum; s += 'A'; re0 += nrB; if(nrB && sum) { s += 'B'; --nrB; --sum; } } else { if(sum) { s += 'B'; --sum; } else { ++nrB; } } } vll A, P(n + 1); vll SA; P[0] = -1; for(auto it : s) { if(it == 'A'){ A.push_back(nrB); if(SA.empty()) SA.push_back(A.back()); else SA.push_back(A.back() + SA.back()); } else { ++nrB; P[nrB] = (int)A.size() - 1; } } vll SAP(n); for(int i = 0; i < n; ++i) { SAP[i] = 0; if(P[i] != -1) SAP[i] = SA[P[i]]; } auto cost = [&](ll st, ll dr) { return st * P[st] - SAP[st] + SA[dr] - st * dr; }; auto t = [&](ll lambda) { ll re = - lambda * k; vll DP(n, INF); vi Nr(n, 0); CHT Sol; for(int i = 0; i < n; ++i) { DP[i] = cost(0, i) + lambda; Nr[i] = 1; if(i) Sol.insert(-i, i * P[i] - SAP[i] + DP[i - 1], Nr[i - 1]); auto [val, nr] = Sol.query(i); val += lambda + SA[i]; if(val < DP[i]) { DP[i] = val; Nr[i] = nr + 1; } } return make_pair(DP[n - 1] + re, Nr[n - 1] - k); }; ll st = 0, dr = 1e12, mij; ll re = 0; for(int i = 0; i <= 200; ++i) { mij = (st + dr) / 2; auto [val, g] = t(mij); re = max(re, val); if(st == dr) break; if(g > 0) st = mij + 1; else dr = mij; } cout << re0 + re << "\n"; return 0; }

Compilation message (stderr)

chorus.cpp: In member function 'std::pair<long long int, int> CHT::query(ll)':
chorus.cpp:43:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::tuple<long long int, long long int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |         while(p + 1 < V.size() && eval(p + 1) < eval(p)) ++p;
      |               ~~~~~~^~~~~~~~~~
chorus.cpp:39:12: warning: unused variable 're' [-Wunused-variable]
   39 |         ll re = INF;
      |            ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...