Submission #786940

#TimeUsernameProblemLanguageResultExecution timeMemory
786940sadsaRice Hub (IOI11_ricehub)C++17
0 / 100
1082 ms3284 KiB
#include "ricehub.h" #include <bits/stdc++.h> using namespace std; using vi = vector<int>; using ii = pair<int, int>; using vii = vector<ii>; using i64 = int64_t; using vl = vector<i64>; using ll = pair<i64, i64>; using vll = vector<ll>; constexpr int iINF = numeric_limits<int>::max(); constexpr i64 lINF = numeric_limits<i64>::max(); #define RANGE(x) begin(x), end(x) template <typename... T> void DBG(T&&... args) { ((cerr << args << ' '), ...) << '\n'; } template <typename T> ostream &operator<<(ostream &out, const vector<T> &vec) { out << '{'; for (size_t i = 0; i < vec.size()-1; ++i) out << vec[i] << ", "; out << vec.back() << '}'; return out; } template <typename T1, typename T2> ostream &operator<<(ostream &out, const pair<T1, T2> &pr) { out << '(' << pr.first << ", " << pr.second << ')'; return out; } struct DPSum { int L; vi rice; vl cost; template <class It> DPSum(It beg, It end): L(end-beg), rice(L), cost(L) { for (int i = 1; i < L; ++i) { } } }; int besthub(int R, int L, int XCa[], long long B) { vi X(XCa, XCa + R); vi hub_count(L+2); for (auto Xi : X) { ++hub_count[Xi]; } vi lreward(L+2); vl lcost(L+2); for (int i = 1; i <= L; ++i) { lreward[i] = lreward[i-1] + hub_count[i]; lcost[i] = lcost[i-1] + lreward[i-1]; } vi rreward(L+2); vl rcost(L+2); for (int i = L; i >= 1; --i) { rreward[i] = rreward[i+1] + hub_count[i]; rcost[i] = rcost[i+1] + rreward[i+1]; } auto lquery = [&] (int Xm, int Xl) { i64 dist = Xm-Xl; return pair{lreward[Xm]-lreward[Xl-1], lcost[Xm]-lcost[Xl]-dist*lreward[Xl-1]}; }; auto rquery = [&] (int Xm, int Xr) { i64 dist = Xr-Xm; return pair{rreward[Xm]-rreward[Xr+1], lcost[Xm]-lcost[Xr]-dist*lreward[Xr+1]}; }; auto range_query = [&] (int Xm, int Xl, int Xr) { auto [lr, lc] = lquery(Xm, Xl); auto [rr, rc] = rquery(Xm, Xr); return pair{lr+rr-hub_count[Xm], lc+rc}; }; int xbeg = X.front(); int xend = X.back(); int ans = 0; for (int xl = xbeg; xl <= xend; ++xl) { for (int xr = xl; xr <= xend; ++xr) { for (int x = xl; x <= xr; ++x) { auto [reward, cost] = range_query(x, xl, xr); if (cost <= B) { ans = max(reward, ans); } else { xr = xend; break; } } } } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...