#include <bits/stdc++.h> using namespace std; const int N=5e5+5; int a[N]; long long d[N], b[N], l[N], sum[N]; vector<int> v; int main() { int n, m; scanf("%d%d", &n, &m); l[m+1]=n; for(int i=0; i<n; ++i) scanf("%d", &a[i]); sort(a, a+n); for(int i=n-1; i>=0; --i) sum[i]=sum[i+1]+a[i]; v.push_back(0); for(int i=1; i<=m; ++i) { scanf("%lld%lld", &d[i], &b[i]); int lo=0, hi=v.size(), mid; long long res=0; while(lo+1!=hi) { mid=(lo+hi)/2; if(b[v[mid]]+(d[i]-d[v[mid]])*a[l[v[mid]]]<=b[i]) lo=mid; else hi=mid; } int num=lo; if(lo==v.size()-1) hi=n; else hi=l[v[lo+1]]; lo=l[v[lo]]-1; while(lo+1!=hi) { mid=(lo+hi)/2; if(b[v[num]]+(d[i]-d[v[num]])*a[mid]<=b[i]) lo=mid; else hi=mid; } v.push_back(m+1); for(int j=v.size()-2; j>num; --j) res+=(d[i]-d[v[j]])*(sum[l[v[j]]]-sum[l[v[j+1]]])+(l[v[j+1]]-l[v[j]])*(b[v[j]]-b[i]); res+=(d[i]-d[v[num]])*(sum[hi]-sum[l[v[num+1]]])+(l[v[num+1]]-hi)*(b[v[num]]-b[i]); v.resize(num+1); if(l[v.back()]==hi) v.pop_back(); if(res!=0) v.push_back(i); l[i]=hi; 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 | #include <bits/stdc++.h> using namespace std; const int N=5e5+5; int a[N]; long long d[N], b[N], l[N], sum[N]; vector<int> v; int main() { int n, m; scanf("%d%d", &n, &m); l[m+1]=n; for(int i=0; i<n; ++i) scanf("%d", &a[i]); sort(a, a+n); for(int i=n-1; i>=0; --i) sum[i]=sum[i+1]+a[i]; v.push_back(0); for(int i=1; i<=m; ++i) { scanf("%lld%lld", &d[i], &b[i]); int lo=0, hi=v.size(), mid; long long res=0; while(lo+1!=hi) { mid=(lo+hi)/2; if(b[v[mid]]+(d[i]-d[v[mid]])*a[l[v[mid]]]<=b[i]) lo=mid; else hi=mid; } int num=lo; if(lo==v.size()-1) hi=n; else hi=l[v[lo+1]]; lo=l[v[lo]]-1; while(lo+1!=hi) { mid=(lo+hi)/2; if(b[v[num]]+(d[i]-d[v[num]])*a[mid]<=b[i]) lo=mid; else hi=mid; } v.push_back(m+1); for(int j=v.size()-2; j>num; --j) res+=(d[i]-d[v[j]])*(sum[l[v[j]]]-sum[l[v[j+1]]])+(l[v[j+1]]-l[v[j]])*(b[v[j]]-b[i]); res+=(d[i]-d[v[num]])*(sum[hi]-sum[l[v[num+1]]])+(l[v[num+1]]-hi)*(b[v[num]]-b[i]); v.resize(num+1); if(l[v.back()]==hi) v.pop_back(); if(res!=0) v.push_back(i); l[i]=hi; printf("%lld\n", res); } return 0; } |