제출 #1192204

#제출 시각아이디문제언어결과실행 시간메모리
1192204NAMINLong Distance Coach (JOI17_coach)C++20
0 / 100
0 ms328 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...