#include <cstdio> #include <vector> #include <algorithm> struct Crop { Crop(int p, long long int d, long long int h): pos(p), day(d), height(h) { } bool operator<(const Crop &rhs) const { return pos < rhs.pos; } int pos; long long int day; long long int height; }; int N,M; int inc[500100]; long long int sum[500100]; std::vector<Crop> crops; long long int getHeight(int pos, long long int day) { int x = std::upper_bound(crops.begin(), crops.end(), Crop(pos,0,0)) - crops.begin() - 1; return (day - crops[x].day) * inc[pos] + crops[x].height; } int findFirst(long long int day, long long int height) { int left=1,right=N+1; while (left < right) { int mid = (left + right) / 2; if (getHeight(mid,day) < height) left = mid+1; else right = mid; } return left; } int main() { scanf("%d %d",&N,&M); for (int i=1; i<=N; ++i) { scanf("%d",&inc[i]); } sum[0] = 0; std::sort(inc+1,inc+N+1); for (int i=1; i<=N; ++i) { sum[i] = inc[i] + sum[i-1]; } crops.push_back(Crop(0,0,0)); for (int i=0; i<M; ++i) { int first; int last = N; long long int day,height; long long int res = 0; scanf("%lld %lld",&day,&height); first = findFirst(day, height); while (crops.rbegin()->pos >= first) { Crop crop = *crops.rbegin(); crops.pop_back(); res += (day - crop.day) * (sum[last] - sum[crop.pos-1]) + (crop.height - height) * (last - crop.pos + 1); last = crop.pos-1; } res += (day - crops.rbegin()->day) * (sum[last] - sum[first-1]) + (crops.rbegin()->height - height) * (last - first + 1); crops.push_back(Crop(first,day,height)); printf("%lld\n",res); } 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 | #include <cstdio> #include <vector> #include <algorithm> struct Crop { Crop(int p, long long int d, long long int h): pos(p), day(d), height(h) { } bool operator<(const Crop &rhs) const { return pos < rhs.pos; } int pos; long long int day; long long int height; }; int N,M; int inc[500100]; long long int sum[500100]; std::vector<Crop> crops; long long int getHeight(int pos, long long int day) { int x = std::upper_bound(crops.begin(), crops.end(), Crop(pos,0,0)) - crops.begin() - 1; return (day - crops[x].day) * inc[pos] + crops[x].height; } int findFirst(long long int day, long long int height) { int left=1,right=N+1; while (left < right) { int mid = (left + right) / 2; if (getHeight(mid,day) < height) left = mid+1; else right = mid; } return left; } int main() { scanf("%d %d",&N,&M); for (int i=1; i<=N; ++i) { scanf("%d",&inc[i]); } sum[0] = 0; std::sort(inc+1,inc+N+1); for (int i=1; i<=N; ++i) { sum[i] = inc[i] + sum[i-1]; } crops.push_back(Crop(0,0,0)); for (int i=0; i<M; ++i) { int first; int last = N; long long int day,height; long long int res = 0; scanf("%lld %lld",&day,&height); first = findFirst(day, height); while (crops.rbegin()->pos >= first) { Crop crop = *crops.rbegin(); crops.pop_back(); res += (day - crop.day) * (sum[last] - sum[crop.pos-1]) + (crop.height - height) * (last - crop.pos + 1); last = crop.pos-1; } res += (day - crops.rbegin()->day) * (sum[last] - sum[first-1]) + (crops.rbegin()->height - height) * (last - first + 1); crops.push_back(Crop(first,day,height)); printf("%lld\n",res); } return 0; } |