#include <iostream> #include <vector> #include <algorithm> struct Frame { unsigned length; unsigned long long time; unsigned long long height; Frame(unsigned length, unsigned long long time, unsigned long long height): length(length), time(time), height(height) {} friend std::ostream & operator << (std::ostream & out, Frame const& F) { return out << "(" << F.length << ", " << F.time << ", " << F.height << ")"; } }; std::vector<unsigned long long> A; std::vector<unsigned long long> pref; unsigned long long at(unsigned idx, Frame const& F, unsigned long long time) { return F.height + A[idx] * (time - F.time); } unsigned long long delta(unsigned begin, unsigned end) { unsigned long long res = 0; if(end != 0) res += pref[end - 1]; if(begin != 0) res -= pref[begin - 1]; return res; } unsigned get_division(unsigned first, unsigned end, Frame const& F, unsigned long long d, unsigned long long b) { unsigned orig_first = first; if(at(first, F, d) < b) return 0; while(end - first > 1) { unsigned middle = (end + first) / 2; if(at(middle, F, d) < b) end = middle; else first = middle; } return end - orig_first; } unsigned split(std::vector<Frame> & S, unsigned long long d, unsigned long long b, unsigned long long & res) { unsigned cnt = 0; while(!S.empty() && at(cnt + S.back().length - 1, S.back(), d) >= b) { Frame & F = S.back(); res += F.length * F.height + delta(cnt, cnt + F.length) * (d - F.time) - F.length * b; cnt += F.length; S.pop_back(); } if(!S.empty()) { Frame & F = S.back(); unsigned dp = get_division(cnt, cnt + F.length, F, d, b); res += dp * F.height + delta(cnt, cnt + dp) * (d - F.time) - dp * b; F.length -= dp; cnt += dp; } return cnt; } int main() { std::ios_base::sync_with_stdio(false); unsigned n, m; std::cin >> n >> m; for(unsigned i = 1; i <= n; i++) { long long unsigned x; std::cin >> x; A.push_back(x); } std::sort(std::begin(A), std::end(A), std::greater<decltype(A)::value_type>()); std::partial_sum(std::begin(A), std::end(A), std::back_inserter(pref)); std::vector<Frame> S; S.emplace_back(n, 0, 0); for(unsigned q = 1; q <= m; q++) { unsigned long long d, b; unsigned long long res = 0; std::cin >> d >> b; unsigned cnt = split(S, d, b, res); if(cnt > 0) S.emplace_back(cnt, d, b); std::cout << res << std::endl; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | #include <iostream> #include <vector> #include <algorithm> struct Frame { unsigned length; unsigned long long time; unsigned long long height; Frame(unsigned length, unsigned long long time, unsigned long long height): length(length), time(time), height(height) {} friend std::ostream & operator << (std::ostream & out, Frame const& F) { return out << "(" << F.length << ", " << F.time << ", " << F.height << ")"; } }; std::vector<unsigned long long> A; std::vector<unsigned long long> pref; unsigned long long at(unsigned idx, Frame const& F, unsigned long long time) { return F.height + A[idx] * (time - F.time); } unsigned long long delta(unsigned begin, unsigned end) { unsigned long long res = 0; if(end != 0) res += pref[end - 1]; if(begin != 0) res -= pref[begin - 1]; return res; } unsigned get_division(unsigned first, unsigned end, Frame const& F, unsigned long long d, unsigned long long b) { unsigned orig_first = first; if(at(first, F, d) < b) return 0; while(end - first > 1) { unsigned middle = (end + first) / 2; if(at(middle, F, d) < b) end = middle; else first = middle; } return end - orig_first; } unsigned split(std::vector<Frame> & S, unsigned long long d, unsigned long long b, unsigned long long & res) { unsigned cnt = 0; while(!S.empty() && at(cnt + S.back().length - 1, S.back(), d) >= b) { Frame & F = S.back(); res += F.length * F.height + delta(cnt, cnt + F.length) * (d - F.time) - F.length * b; cnt += F.length; S.pop_back(); } if(!S.empty()) { Frame & F = S.back(); unsigned dp = get_division(cnt, cnt + F.length, F, d, b); res += dp * F.height + delta(cnt, cnt + dp) * (d - F.time) - dp * b; F.length -= dp; cnt += dp; } return cnt; } int main() { std::ios_base::sync_with_stdio(false); unsigned n, m; std::cin >> n >> m; for(unsigned i = 1; i <= n; i++) { long long unsigned x; std::cin >> x; A.push_back(x); } std::sort(std::begin(A), std::end(A), std::greater<decltype(A)::value_type>()); std::partial_sum(std::begin(A), std::end(A), std::back_inserter(pref)); std::vector<Frame> S; S.emplace_back(n, 0, 0); for(unsigned q = 1; q <= m; q++) { unsigned long long d, b; unsigned long long res = 0; std::cin >> d >> b; unsigned cnt = split(S, d, b, res); if(cnt > 0) S.emplace_back(cnt, d, b); std::cout << res << std::endl; } } |