Submission #1325523

#TimeUsernameProblemLanguageResultExecution timeMemory
1325523PieArmyLong Distance Coach (JOI17_coach)C++20
100 / 100
116 ms9364 KiB
#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;
#define mid ((left+right)>>1)
typedef long double ld;

int n,m;
ll son,w,t;
ll su[200023],arr[200023],cost[200023];
int ilk[200023];
ll sum=0;
map<ll,ll,greater<ll>>mp;
ll tim;
ll ek=0;
ll ans=0;

ld f(pair<ll,ll>a,pair<ll,ll>b){
	return ld(a.sc-b.sc)/ld(b.fr-a.fr);
}

void ekle(pair<ll,ll>p){
	if(mp.count(p.fr)){
		if(mp[p.fr]>p.sc)return;
	}
	mp[p.fr]=p.sc;
	while(true){
		auto b=mp.upper_bound(p.fr);
		if(b==mp.end())break;
		auto a=b++;
		if(b==mp.end())break;
		if(f(*a,*b)>f(p,*a)){
			mp.erase(a);
		}
		else break;
	}
	while(true){
		auto a=mp.find(p.fr);
		if(a==mp.begin())break;
		a--;
		if(a==mp.begin())break;
		auto b=a--;
		if(f(*b,p)>f(*a,*b)){
			mp.erase(b);
		}
		else break;
	}
	{
		auto a=mp.find(p.fr);
		if(a!=mp.begin()){
			auto b=a--;
			b++;
			if(b!=mp.end()){
				if(f(p,*b)>f(*a,p)){
					mp.erase(p.fr);
					return;
				}
			}
		}
	}
}

void cook(){
	while(mp.size()>1){
		pair<ll,ll>a=*mp.begin(),b=*(++mp.begin());
		if(f(a,b)>=tim){
			mp.erase(mp.begin());
		}
		else break;
	}
}

signed main(){
	ios_base::sync_with_stdio(23^23);cin.tie(0);
	cin>>son>>n>>m>>w>>t;
	for(int i=1;i<=n;i++){
		cin>>su[i];
	}
	su[n+1]=son;
	for(int i=1;i<=m;i++){
		cin>>arr[i]>>cost[i];
	}
	sort(su+1,su+n+1);
	{
		vector<pair<ll,ll>>v;
		for(int i=1;i<=m;i++){
			v.pb({arr[i],cost[i]});
		}
		sort(v.begin(),v.end());
		for(int i=1;i<=m;i++){
			arr[i]=v[i-1].fr;
			cost[i]=v[i-1].sc;
		}
	}
	sum=(son/t+1)*w;
	for(int i=1;i<=m;i++){
		sum+=(son/t+((son%t)>arr[i]))*w;
		if(son%t>arr[i]){
			cost[i]-=w;
		}
	}
	for(int i=1;i<=n+1;i++){
		int l=0,r=m;
		while(l<r){
			int mi=(l+r+1)/2;
			if(arr[mi]<(su[i]%t))l=mi;
			else r=mi-1;
		}
		if(l&&!ilk[l])ilk[l]=i;
	}
	ekle({0,0});
	for(tim=m;tim>=1;tim--){
		pair<ll,ll>p;
		if(ilk[tim]){
			ll wi=(son/t)-(su[ilk[tim]]/t);
			wi*=w;
			p={-wi,ans+wi*(tim+1)};
			ekle(p);
		}
		cook();
		ans+=cost[tim];
		ek+=cost[tim];
		p=*mp.begin();
		ans=max(ans,p.sc+p.fr*tim);
	}
	ans-=ek;
	cout<<sum-ans<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...