#include <bits/stdc++.h>
using namespace std;
#define REP(i,n) for(int i=0;i<(n);++i)
#define ALL(c) (c).begin(), (c).end()
#define SIZE(c) ((int)(c).size())
#define MAXN 200000
typedef long long ll;
ll t[MAXN];
int d[MAXN];
ll ans[MAXN];
int idxd[MAXN];
int n,m;
struct dst {
ll d;
int num;
int nxt;
typedef pair<ll, int> pli;
bool operator<(const dst& oth){
if(d == LLONG_MAX) return false;
if(oth.d == LLONG_MAX) return true;
return pli(d*oth.num,nxt) < pli(oth.d*num,oth.nxt);
}
} dist[MAXN];
int merge(int a){
int b = dist[a].nxt;
if(dist[b].d == LLONG_MAX)
dist[a].d = LLONG_MAX;
else
dist[a].d += dist[b].d;
dist[a].num += dist[b].num;
dist[a].nxt = dist[b].nxt;
return b;
}
bool overlap(int a, int k){
const dst& d = dist[a];
return d.d <= (ll)k*d.num;
}
ll sq(int a){
const dst& d = dist[a];
if(d.d == LLONG_MAX)
return (ll)d.num*(d.num+1)/2;
return (ll)d.num*(d.num-1)/2;
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0);
cin>>n>>m;
REP(i,n) cin>>t[i];
REP(i,n+1) {
if(i == 0)
dist[i] = dst{t[i],1,1};
else if(i == n)
dist[i] = dst{LLONG_MAX,0,-1};
else
dist[i] = dst{t[i]-t[i-1],1,i+1};
}
REP(i,m) cin>>d[i];
REP(i,m) idxd[i]=i;
const auto cmp = [](int a, int b){return dist[a] < dist[b];};
set<int,decltype(cmp)> ds(cmp);
REP(i,n+1) ds.insert(i);
ll ssq=0;
int psize=0;
int besttotal=INT_MAX;
sort(idxd, idxd+m, [](int a, int b){return d[a]<d[b];});
ll calc=0;
int lst=0;
REP(i,m){
int diff = d[idxd[i]]-lst;
lst = d[idxd[i]];
calc += ssq*diff;
while(ds.size()>1 && overlap(*ds.begin(), lst)){
int t = *ds.begin();
ds.erase(ds.begin());
ssq -= sq(t);
dst old = dist[t];
int k = merge(t);
ssq += sq(t) - sq(k);
ds.erase(k);
ll np = (dist[k].d == LLONG_MAX ? dist[k].num+1 : dist[k].num);
calc += np*((ll)old.num*lst - old.d);
ds.insert(t);
}
ans[idxd[i]] = calc;
}
REP(i,m) cout<<ans[i]<<'\n';
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 | #include <bits/stdc++.h> using namespace std; #define REP(i,n) for(int i=0;i<(n);++i) #define ALL(c) (c).begin(), (c).end() #define SIZE(c) ((int)(c).size()) #define MAXN 200000 typedef long long ll; ll t[MAXN]; int d[MAXN]; ll ans[MAXN]; int idxd[MAXN]; int n,m; struct dst { ll d; int num; int nxt; typedef pair<ll, int> pli; bool operator<(const dst& oth){ if(d == LLONG_MAX) return false; if(oth.d == LLONG_MAX) return true; return pli(d*oth.num,nxt) < pli(oth.d*num,oth.nxt); } } dist[MAXN]; int merge(int a){ int b = dist[a].nxt; if(dist[b].d == LLONG_MAX) dist[a].d = LLONG_MAX; else dist[a].d += dist[b].d; dist[a].num += dist[b].num; dist[a].nxt = dist[b].nxt; return b; } bool overlap(int a, int k){ const dst& d = dist[a]; return d.d <= (ll)k*d.num; } ll sq(int a){ const dst& d = dist[a]; if(d.d == LLONG_MAX) return (ll)d.num*(d.num+1)/2; return (ll)d.num*(d.num-1)/2; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin>>n>>m; REP(i,n) cin>>t[i]; REP(i,n+1) { if(i == 0) dist[i] = dst{t[i],1,1}; else if(i == n) dist[i] = dst{LLONG_MAX,0,-1}; else dist[i] = dst{t[i]-t[i-1],1,i+1}; } REP(i,m) cin>>d[i]; REP(i,m) idxd[i]=i; const auto cmp = [](int a, int b){return dist[a] < dist[b];}; set<int,decltype(cmp)> ds(cmp); REP(i,n+1) ds.insert(i); ll ssq=0; int psize=0; int besttotal=INT_MAX; sort(idxd, idxd+m, [](int a, int b){return d[a]<d[b];}); ll calc=0; int lst=0; REP(i,m){ int diff = d[idxd[i]]-lst; lst = d[idxd[i]]; calc += ssq*diff; while(ds.size()>1 && overlap(*ds.begin(), lst)){ int t = *ds.begin(); ds.erase(ds.begin()); ssq -= sq(t); dst old = dist[t]; int k = merge(t); ssq += sq(t) - sq(k); ds.erase(k); ll np = (dist[k].d == LLONG_MAX ? dist[k].num+1 : dist[k].num); calc += np*((ll)old.num*lst - old.d); ds.insert(t); } ans[idxd[i]] = calc; } REP(i,m) cout<<ans[i]<<'\n'; return 0; } |
English