| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 319648 | arnold518 | Long Distance Coach (JOI17_coach) | C++14 | 573 ms | 49872 KiB | 
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
 
const int MAXN = 4e5;
 
ll X, W, T;
int N, M, K;
 
vector<pll> V;
ll SS[MAXN+10];
pll C[MAXN+10];
ll A[MAXN+10];
 
ll dp[MAXN+10];
map<ll, ll> MM;
ll S[MAXN+10], TT[MAXN+10];
struct Line
{
	ll a, b;
};
long double cross(Line p, Line q) { return (long double)(q.b-p.b)/(p.a-q.a); }
struct CHT
{
	vector<Line> S;
	void push(Line p)
	{
		if(!S.empty() && S.back().a==p.a)
		{
			if(S.back().b<=p.b) return;
			S.pop_back();
		}
		while(S.size()>1 && cross(S[S.size()-1], p)>=cross(S[S.size()-2], S[S.size()-1])) S.pop_back();
		S.push_back(p);
	}
	ll query(ll x)
	{
		int lo=0, hi=S.size();
		while(lo+1<hi)
		{
			int mid=lo+hi>>1;
			if(cross(S[mid], S[mid-1])>=x) lo=mid;
			else hi=mid;
		}
		return S[lo].a*x+S[lo].b;
	}
}cht;
 
int main()
{
	scanf("%lld%d%d%lld%lld", &X, &N, &M, &W, &T);
 
	for(int i=1; i<=N; i++) scanf("%lld", &SS[i]);
	sort(SS+1, SS+N+1, greater<ll>());
 
	{
		ll x, y;
		x=X%T; y=X/T;
		MM[x]=-y;
	}
	for(int i=1; i<=N; i++)
	{
		ll x, y;
		x=SS[i]%T; y=SS[i]/T;
		MM[x]=-y;
	}
 
	for(int i=1; i<=M; i++)
	{
		scanf("%lld%lld", &C[i].first, &C[i].second);
		dp[0]+=C[i].second;
		MM[C[i].first]=C[i].second;
 
		dp[0]+=W*(X/T);
		if(C[i].first<=X%T) dp[0]+=W;
	}
	dp[0]+=W*(X/T+1);
 
	K=MM.size();
	int t=1, P;
	for(auto it : MM)
	{
		if(it.first==X%T) P=t;
		A[t++]=it.second;
	}
 
	for(int i=1; i<=K; i++)
	{
		if(A[i]>0)
		{
			S[i]=S[i-1]+X/T;
			TT[i]=TT[i-1]+1;
			if(i<=P) S[i]++;
		}
		else
		{
			S[i]=S[i-1];
			TT[i]=TT[i-1];
		}
	}
	for(int i=1; i<=K; i++)
	{
		cht.push({TT[i-1], W*S[i-1]+dp[i-1]});
		if(A[i]>0)
		{
			dp[i]=dp[i-1]-A[i];
		}
		else
		{
			dp[i]=cht.query(W*A[i])-W*(A[i]*TT[i]+S[i]);
		}
	}
 
	printf("%lld\n", dp[K]);
}
Compilation message (stderr)
| # | 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... | ||||
