#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
#define pb push_back
#define bk back()
#define si size()
#define lf(x) ((x)<<1)
#define ri(x) (lf(x)+1)
const int maxn=500005;
struct seg{
ll h, t;
int p, q;
seg(int a, int b, ll c, ll d)
: p(a), q(b), h(c), t(d) {}
};
ll a[maxn];
ll p[maxn];
inline ll diff(seg s, ll d, ll b, int x){
return (d-s.t)*a[x]+s.h-b;
}
int binSearch(seg s, ll d, ll b){
while(s.p<=s.q){
int m=(s.p+s.q)/2;
if(diff(s, d, b, m)>0)
s.q=m-1;
else s.p=m+1;
}
return s.q+1;
}
inline ll sum(int a, int b){
return p[b]-((a>0)?p[a-1]:0);
}
inline ll cutSum(int p, int q, ll h, ll t, ll d, ll b){
return (sum(p, q)*(d-t))+(h-b)*(q-p+1);
}
int main()
{
ll d, b;
int n, m;
scanf("%d%d", &n, &m);
for(int i=0;i<n;++i)
scanf("%lld", a+i);
sort(a, a+n);
p[0]=a[0];
for(int i=1;i<n;++i)
p[i]=p[i-1]+a[i];
vector<seg> S;
S.pb(seg(0, n-1, 0, 0));
while(m--){
ll res=0;
scanf("%lld%lld", &d, &b);
while(!S.empty() && diff(S.bk, d, b, S.bk.p)>0){
res+=cutSum(S.bk.p, S.bk.q, S.bk.h, S.bk.t, d, b);
S.pop_back();
}
if(S.empty())
S.pb(seg(0, n-1, b, d));
else{
int x=binSearch(S.bk, d, b);
if(x<n){
res+=cutSum(x, S.bk.q, S.bk.h, S.bk.t, d, b);
S.bk.q=x-1;
S.pb(seg(x, n-1, b, d));
}
}
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 78 79 80 | #include <cstdio> #include <algorithm> #include <vector> #include <cmath> using namespace std; typedef long long ll; #define pb push_back #define bk back() #define si size() #define lf(x) ((x)<<1) #define ri(x) (lf(x)+1) const int maxn=500005; struct seg{ ll h, t; int p, q; seg(int a, int b, ll c, ll d) : p(a), q(b), h(c), t(d) {} }; ll a[maxn]; ll p[maxn]; inline ll diff(seg s, ll d, ll b, int x){ return (d-s.t)*a[x]+s.h-b; } int binSearch(seg s, ll d, ll b){ while(s.p<=s.q){ int m=(s.p+s.q)/2; if(diff(s, d, b, m)>0) s.q=m-1; else s.p=m+1; } return s.q+1; } inline ll sum(int a, int b){ return p[b]-((a>0)?p[a-1]:0); } inline ll cutSum(int p, int q, ll h, ll t, ll d, ll b){ return (sum(p, q)*(d-t))+(h-b)*(q-p+1); } int main() { ll d, b; int n, m; scanf("%d%d", &n, &m); for(int i=0;i<n;++i) scanf("%lld", a+i); sort(a, a+n); p[0]=a[0]; for(int i=1;i<n;++i) p[i]=p[i-1]+a[i]; vector<seg> S; S.pb(seg(0, n-1, 0, 0)); while(m--){ ll res=0; scanf("%lld%lld", &d, &b); while(!S.empty() && diff(S.bk, d, b, S.bk.p)>0){ res+=cutSum(S.bk.p, S.bk.q, S.bk.h, S.bk.t, d, b); S.pop_back(); } if(S.empty()) S.pb(seg(0, n-1, b, d)); else{ int x=binSearch(S.bk, d, b); if(x<n){ res+=cutSum(x, S.bk.q, S.bk.h, S.bk.t, d, b); S.bk.q=x-1; S.pb(seg(x, n-1, b, d)); } } printf("%lld\n", res); } } |
English