#include <iostream>
#include <cstdio>
#include <set>
#include <algorithm>
using namespace std;
const int N=2*1e5+5;
const long long INF=1e18;
long long n, m, pop[N], nast[N];
long long t[N], an[N];
struct piekarnik
{
long long d, id;
};
piekarnik d[N];
bool cmp1(piekarnik x, piekarnik y)
{
return x.d<y.d;
}
bool cmp2(piekarnik x, piekarnik y)
{
return x.id<y.id;
}
typedef pair<long long, long long> P;
struct cmp
{
bool operator()(P x, P y)
{
if(x.first==y.first) return x.second<y.second;
return x.first<y.first;
}
};
long long dod(long long x, long long y)
{
long long ans=(t[x]-t[y])/(x-y);
ans+=1;
return ans;
}
long long aryt(long long d)
{
return (d*(d+1))/2;
}
set<P,cmp> S;
int main()
{
scanf("%lld%lld", &n, &m);
t[n+1]=INF;
for(int i=1;i<=n;i++)
{
scanf("%lld", &t[i]);
pop[i]=i-1;
nast[i]=i+1;
S.insert(make_pair(t[i]-t[i-1]+1,i));
}
S.insert(make_pair(INF-t[n],n+1));
for(int i=1;i<=m;i++)
{
scanf("%lld", &d[i].d);
d[i].id=i;
}
sort(d+1,d+m+1,cmp1);
long long il=0, ans=0;
long long ost=0;
for(int i=1;i<=m;i++)
{
while((*S.begin()).first<=d[i].d)
{
long long x=(*S.begin()).first;
long long y=(*S.begin()).second;
S.erase(S.begin());
ans+=(x-ost)*il;
ans+=(t[pop[y]]+x*(y-pop[y])-t[y])*(nast[y]-y);
ost=x;
long long nas=nast[y];
long long popo=pop[y];
S.erase(make_pair(dod(nas,y),nas));
pop[nas]=popo;
nast[popo]=nas;
S.insert(make_pair(dod(nas,popo),nas));
il-=aryt(nas-y);
il-=aryt(y-popo);
il+=aryt(nas-popo);
}
ans+=(d[i].d-ost)*il;
ost=d[i].d;
an[d[i].id]=ans;
}
for(int i=1;i<=m;i++) printf("%lld\n", an[i]);
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 | #include <iostream> #include <cstdio> #include <set> #include <algorithm> using namespace std; const int N=2*1e5+5; const long long INF=1e18; long long n, m, pop[N], nast[N]; long long t[N], an[N]; struct piekarnik { long long d, id; }; piekarnik d[N]; bool cmp1(piekarnik x, piekarnik y) { return x.d<y.d; } bool cmp2(piekarnik x, piekarnik y) { return x.id<y.id; } typedef pair<long long, long long> P; struct cmp { bool operator()(P x, P y) { if(x.first==y.first) return x.second<y.second; return x.first<y.first; } }; long long dod(long long x, long long y) { long long ans=(t[x]-t[y])/(x-y); ans+=1; return ans; } long long aryt(long long d) { return (d*(d+1))/2; } set<P,cmp> S; int main() { scanf("%lld%lld", &n, &m); t[n+1]=INF; for(int i=1;i<=n;i++) { scanf("%lld", &t[i]); pop[i]=i-1; nast[i]=i+1; S.insert(make_pair(t[i]-t[i-1]+1,i)); } S.insert(make_pair(INF-t[n],n+1)); for(int i=1;i<=m;i++) { scanf("%lld", &d[i].d); d[i].id=i; } sort(d+1,d+m+1,cmp1); long long il=0, ans=0; long long ost=0; for(int i=1;i<=m;i++) { while((*S.begin()).first<=d[i].d) { long long x=(*S.begin()).first; long long y=(*S.begin()).second; S.erase(S.begin()); ans+=(x-ost)*il; ans+=(t[pop[y]]+x*(y-pop[y])-t[y])*(nast[y]-y); ost=x; long long nas=nast[y]; long long popo=pop[y]; S.erase(make_pair(dod(nas,y),nas)); pop[nas]=popo; nast[popo]=nas; S.insert(make_pair(dod(nas,popo),nas)); il-=aryt(nas-y); il-=aryt(y-popo); il+=aryt(nas-popo); } ans+=(d[i].d-ost)*il; ost=d[i].d; an[d[i].id]=ans; } for(int i=1;i<=m;i++) printf("%lld\n", an[i]); return 0; } |
English