#include <iostream> #include <assert.h> #include <vector> #include <algorithm> using namespace std; int main() { size_t n, m; cin >> n >> m; assert(1 <= n); assert(n <= 200000); assert(1 <= m); assert(m <= 200000); struct Group { uint64_t t; uint32_t n; uint32_t prev; bool present; }; vector<Group> G; G.push_back({0, 0, 0, true}); for (size_t i = 0; i < n; i++) { uint64_t t; cin >> t; assert(t <= 1000000000000LL); assert(G.back().t <= t); if (G.back().t == t) { G.back().n++; } else { G.push_back({t, 0, uint32_t(G.size())-1, true}); } } vector<uint32_t> O(m); for (size_t i = 0; i < m; i++) { int32_t d; cin >> d; assert(1 <= d); assert(d <= 1000000); O[i] = d; } vector<uint32_t> Od(m); // ovens by time for (uint32_t i = 0; i < m; i++) Od[i] = i; sort(Od.begin(), Od.end(), [&O](uint32_t a, uint32_t b) { return O[a] < O[b]; }); vector<uint64_t> R(m); uint64_t W = 0; uint32_t D = 0; uint64_t w = 0; for (auto g: G) w += uint64_t(g.n+1) * g.n / 2; vector<uint32_t> P(uint32_t(G.size())-1); for (uint32_t i = 0; i < P.size(); i++) { P[i] = i + 1; } for (uint32_t i = 0; i < m; i++) { uint32_t d = O[Od[i]]; uint32_t dd = d - D; vector<Group> NG; W += w * dd; for (uint32_t j = 0; j < P.size(); j++) { auto &g = G[P[j]]; assert(g.present); uint32_t k = g.prev; while (!G[k].present) { uint32_t nk = G[k].prev; assert(nk != k); k = nk; } g.prev = k; auto &b = G[k]; uint64_t le = b.t + uint64_t(b.n+1) * d; if (le > g.t) { uint64_t dW = le - g.t; W += (g.n+1) * dW; g.t += dW; w -= uint64_t(g.n+1) * g.n / 2; w -= uint64_t(b.n+1) * b.n / 2; b.n += g.n+1; w += uint64_t(b.n+1) * b.n / 2; g.present = false; P.erase(P.begin() + j); j--; } } R[Od[i]] = W; D = d; } for (auto r: R) cout << r << endl; return 0; }
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 95 96 97 98 99 | #include <iostream> #include <assert.h> #include <vector> #include <algorithm> using namespace std; int main() { size_t n, m; cin >> n >> m; assert(1 <= n); assert(n <= 200000); assert(1 <= m); assert(m <= 200000); struct Group { uint64_t t; uint32_t n; uint32_t prev; bool present; }; vector<Group> G; G.push_back({0, 0, 0, true}); for (size_t i = 0; i < n; i++) { uint64_t t; cin >> t; assert(t <= 1000000000000LL); assert(G.back().t <= t); if (G.back().t == t) { G.back().n++; } else { G.push_back({t, 0, uint32_t(G.size())-1, true}); } } vector<uint32_t> O(m); for (size_t i = 0; i < m; i++) { int32_t d; cin >> d; assert(1 <= d); assert(d <= 1000000); O[i] = d; } vector<uint32_t> Od(m); // ovens by time for (uint32_t i = 0; i < m; i++) Od[i] = i; sort(Od.begin(), Od.end(), [&O](uint32_t a, uint32_t b) { return O[a] < O[b]; }); vector<uint64_t> R(m); uint64_t W = 0; uint32_t D = 0; uint64_t w = 0; for (auto g: G) w += uint64_t(g.n+1) * g.n / 2; vector<uint32_t> P(uint32_t(G.size())-1); for (uint32_t i = 0; i < P.size(); i++) { P[i] = i + 1; } for (uint32_t i = 0; i < m; i++) { uint32_t d = O[Od[i]]; uint32_t dd = d - D; vector<Group> NG; W += w * dd; for (uint32_t j = 0; j < P.size(); j++) { auto &g = G[P[j]]; assert(g.present); uint32_t k = g.prev; while (!G[k].present) { uint32_t nk = G[k].prev; assert(nk != k); k = nk; } g.prev = k; auto &b = G[k]; uint64_t le = b.t + uint64_t(b.n+1) * d; if (le > g.t) { uint64_t dW = le - g.t; W += (g.n+1) * dW; g.t += dW; w -= uint64_t(g.n+1) * g.n / 2; w -= uint64_t(b.n+1) * b.n / 2; b.n += g.n+1; w += uint64_t(b.n+1) * b.n / 2; g.present = false; P.erase(P.begin() + j); j--; } } R[Od[i]] = W; D = d; } for (auto r: R) cout << r << endl; return 0; } |