#include <cstdio> #include <vector> #include <algorithm> using namespace std; vector < long long > tempo, pref; vector < pair < int, pair < long long, long long > > > zboze; int n,m; int main(){ scanf("%d%d",&n,&m); for (int i = 0; i < n; i++){ int a; scanf("%d",&a); tempo.push_back(a); } sort(tempo.begin(), tempo.end()); tempo.insert(tempo.begin(), 0); pref.push_back(0); for (int i = 1; i <= n; i++){ pref.push_back(tempo[i] + pref[i-1]); } zboze.push_back(make_pair(0, make_pair(0,0))); for (int i = 0; i < m; i++){ long long res = 0; long long d,b; scanf("%lld%lld",&d,&b); int e = 0, f = zboze.size()-1, l = 0, w = -1, p; while (e <= f){ int mid = (e+f)/2; if (tempo[ zboze[mid].first ] * (d - zboze[mid].second.first) + zboze[mid].second.second <= b){ l = mid; e = mid + 1; } else { f = mid - 1; } } e = zboze[ l ].first; if (l < zboze.size()-1){ f = zboze[ l+1 ].first - 1; } else { f = n; } p = f; while (e <= f){ int mid = (e+f)/2; if (l < zboze.size()-1); if (tempo[ mid ] * (d - zboze[l].second.first) + zboze[l].second.second <= b){ w = mid; e = mid + 1; } else { f = mid - 1; } } int first_w = w; res += (pref[p] - pref[w]) * (d - zboze[l].second.first) + zboze[l].second.second * (p - w) - b * (p - w); for (int j = l+1; j < zboze.size(); j++){ if (j < zboze.size()-1){ p = zboze[j+1].first - 1; } else { p = n; } w = zboze[j].first - 1; res += (pref[p] - pref[w]) * (d - zboze[j].second.first) + zboze[j].second.second * (p - w) - b * (p - w); } int zboze_size = zboze.size(); for (int j = l+1; j < zboze_size; j++){ zboze.pop_back(); } if (first_w < n){ zboze.push_back(make_pair(first_w+1, make_pair(d,b))); } printf("%lld\n", res); } }
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 | #include <cstdio> #include <vector> #include <algorithm> using namespace std; vector < long long > tempo, pref; vector < pair < int, pair < long long, long long > > > zboze; int n,m; int main(){ scanf("%d%d",&n,&m); for (int i = 0; i < n; i++){ int a; scanf("%d",&a); tempo.push_back(a); } sort(tempo.begin(), tempo.end()); tempo.insert(tempo.begin(), 0); pref.push_back(0); for (int i = 1; i <= n; i++){ pref.push_back(tempo[i] + pref[i-1]); } zboze.push_back(make_pair(0, make_pair(0,0))); for (int i = 0; i < m; i++){ long long res = 0; long long d,b; scanf("%lld%lld",&d,&b); int e = 0, f = zboze.size()-1, l = 0, w = -1, p; while (e <= f){ int mid = (e+f)/2; if (tempo[ zboze[mid].first ] * (d - zboze[mid].second.first) + zboze[mid].second.second <= b){ l = mid; e = mid + 1; } else { f = mid - 1; } } e = zboze[ l ].first; if (l < zboze.size()-1){ f = zboze[ l+1 ].first - 1; } else { f = n; } p = f; while (e <= f){ int mid = (e+f)/2; if (l < zboze.size()-1); if (tempo[ mid ] * (d - zboze[l].second.first) + zboze[l].second.second <= b){ w = mid; e = mid + 1; } else { f = mid - 1; } } int first_w = w; res += (pref[p] - pref[w]) * (d - zboze[l].second.first) + zboze[l].second.second * (p - w) - b * (p - w); for (int j = l+1; j < zboze.size(); j++){ if (j < zboze.size()-1){ p = zboze[j+1].first - 1; } else { p = n; } w = zboze[j].first - 1; res += (pref[p] - pref[w]) * (d - zboze[j].second.first) + zboze[j].second.second * (p - w) - b * (p - w); } int zboze_size = zboze.size(); for (int j = l+1; j < zboze_size; j++){ zboze.pop_back(); } if (first_w < n){ zboze.push_back(make_pair(first_w+1, make_pair(d,b))); } printf("%lld\n", res); } } |