#include <bits/stdc++.h>
#define endl "\n"
#define ll long long
using namespace std;
struct pass{
ll d,c;
bool operator<(const pass p)const{
if(d == p.d)
return c < p.c;
return d < p.d;
}
};
struct Line{
ll m,p;
};
ll len = 1;
struct leechaotree{
vector<Line> tree;
leechaotree(ll l){
while(len < l){
len *= 2;
}
tree = vector<Line>(2*len,{0,(ll)1e18});
}
ll calc(Line line,ll x){
return 1LL*(-x+1)*line.m+line.p;
}
void insert(Line nw,ll l=0,ll r=len-1,int v=1){
ll mid = l+(r-l)/2;
if(calc(nw,mid) < calc(tree[v],mid)){
swap(tree[v],nw);
}
if(r==l)
return;
else if(calc(nw,l) < calc(tree[v],l)){
insert(nw,l,mid,v*2);
}
else
insert(nw,mid+1,r,v*2+1);
}
ll query(ll x,ll l=0,ll r=len-1,int v=1){
if(l==x)
return 1LL*(-x+1)*tree[v].m+tree[v].p;
ll mid = l+(r-l)/2;
if(l <= x && x <= mid)
return min(1LL*(-x+1)*tree[v].m+tree[v].p,query(x,l,mid,v*2));
else
return min(1LL*(-x+1)*tree[v].m+tree[v].p,query(x,mid+1,r,v*2+1));
}
};
void solve(){
ll X,N,M,W,T;
cin >> X >> N >> M >> W >> T;
vector<ll> S(N);
for(int i=0;i<N;i++)
cin >> S[i];
S.push_back(X);
vector<pass> passager(M);
for(int i=0;i<M;i++){
cin >> passager[i].d >> passager[i].c;
}
sort(passager.begin(),passager.end());
sort(S.begin(),S.end(),[&](const ll& a,const ll& b){ return a%T < b%T;});
vector<ll> pref(M+1,0);
for(int i=1;i<=M;i++){
pref[i] = pref[i-1]+passager[i-1].c;
}
vector<ll> last(N+1,0);
for(int i=0;i<=N;i++){
pass p = {S[i]%T,-1LL};
auto it = upper_bound(passager.begin(),passager.end(),p);
it--;
ll l = it-passager.begin();
last[i] = l;
}
vector<ll> dp(M+1,1e18);
dp[M] = 0;
leechaotree lct(M+1);
for(int i=M-1,j=N;i>=0;i--){
ll D = passager[i].d,C = passager[i].c;
while(j >= 0 && i <= last[j]){
D = passager[last[j]].d;
Line line = {1LL*((S[j]-D)/T) * W,1LL*last[j]*((S[j]-D)/T)*W+dp[last[j]+1]
+pref[last[j]+1]};
lct.insert(line);
j--;
}
D = passager[i].d,C = passager[i].c;
dp[i] = dp[i+1]+((X-D)/T+1)*W;
dp[i] = min(dp[i],-pref[i]+lct.query(i));
//cout << "dp[i] : " << dp[i] << endl;
//cout << i << ' ' << j << endl;
/*for(int j=0;j<=N;j++){
if(S[j]%T > D){
dp[i] = min(dp[last+1]+(pref[last+1]-pref[i])+(last-i+1)*((S[j]-D)/T)*W
,dp[i]);
}
}*/
}
cout << dp[0] + ((X/T+1) * W) << endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t = 1;
//cin >> t;
while(t--){
solve();
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |