Submission #1362302

#TimeUsernameProblemLanguageResultExecution timeMemory
1362302WH8Long Distance Coach (JOI17_coach)C++17
71 / 100
2092 ms9660 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
using namespace std;
using namespace __gnu_pbds;
#define g0(x) get<0>(x)
#define g1(x) get<1>(x)
#define g2(x) get<2>(x)
#define mt make_tuple
#define mp make_pair
#define int long long 
#define f first
#define s second
#define pll pair<long long, long long>
#define iii tuple<int,int,int>
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define pb push_back

signed main(){
	int x,n,m,w,t;cin>>x>>n>>m>>w>>t;
	vector<pll> v;
	for(int i=0;i<n;i++){ // refill
		int s;
		cin>>s;
		v.pb({s % t, s/t});
	}
	n++;
	v.pb({x % t, x/t});
	int ini=0;
	for(int i=0;i<m;i++){
		int d,c;cin>>d>>c;
		v.pb({d, -c});
		ini += (x/t + ((x % t) > d)) * w;
	}
	ini += (x/t + 1) * w;
	//cout<<ini<<endl;
	v.pb({-1, -1});
	sort(all(v));
	//for(auto [a, b] : v)printf(" (%lld,%lld) ", a,b); cout<<endl;
	vector<int> dp(n+m+1, 0);
	for(int i=1;i<=n+m;i++){
		int savings=0, bestr=1e18;
		dp[i]=dp[i-1];
		if(v[i].s < 0) continue;
		for(int j=i;j>=1;j--){
			if(v[j].s >= 0) bestr=min(bestr, v[j].s);
			else {
				savings += (x/t+(x%t>v[j].f) - bestr) * w + v[j].s;
			}
			//printf("i %lld to j %lld, savings %lld\n", i, j, savings);
			dp[i]=max(dp[i], dp[j-1] + savings);
		}
	}
	cout<<ini - dp[n+m];
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...