제출 #1190067

#제출 시각아이디문제언어결과실행 시간메모리
11900678pete8Long Distance Coach (JOI17_coach)C++20
100 / 100
133 ms23872 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define f first
#define s second
#define pii pair<int,int>
#define ppii pair<int,pii>
#define vi vector<int>
#define pb push_back
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define F(n) for(int i=0;i<n;i++)
#define lb lower_bound
#define ub upper_bound
#define fastio ios::sync_with_stdio(false);cin.tie(NULL);
#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
#define sz(x) (int)((x).size())
#define int long long
using namespace std;
const int mod=1e9+7,mxn=3e5,inf=1e18,minf=-1e18,lg=30,Mxn=1e9;
//#undef int
int n,k,m,d,q,X,W,T;
void setIO(string name){
	ios_base::sync_with_stdio(0); cin.tie(0);
	freopen((name+".in").c_str(),"r",stdin);
	freopen((name+".out").c_str(),"w",stdout);
}
int S[mxn+10],D[mxn+10],C[mxn+10];
int dp[mxn+10],pref[mxn+10],mode=1;
//min convex hull
struct line{
	int m,c;
	mutable int p;
	bool operator<(line x)const{
		if(mode)return m>x.m;
		return p<x.p;
	};
	int get(int x)const{return (m*x)+c;}
};
struct cht{
	multiset<line>v;
	int div(int a,int b){return (a/b)-!(a%b||(a*b>=0));}
	int intersect(multiset<line>::iterator a,multiset<line>::iterator b){
		return div(a->c-b->c,b->m-a->m);
	}
	bool bad(multiset<line>::iterator a,multiset<line>::iterator b){
		if(b==v.end())return a->p=inf,0;
		if(a->m==b->m)a->p=((a->c<=b->c)?inf:minf);
		else a->p=intersect(a,b);
		return a->p>=b->p;
	}
	void add(line a){
		auto it=v.insert(a);
		while(bad(it,next(it)))v.erase(next(it));
		if(it!=v.begin()&&bad(prev(it),it))bad(prev(it),it=v.erase(it));
		if(it!=v.begin())it=prev(it);
		while(it!=v.begin()&&bad(prev(it),it)){
			bad(prev(it),it=v.erase(it));
			it=prev(it);
		}
	}
	int qry(int x){
		mode=0;
		auto it=v.lb({0,0,x});
		mode=1;
		return it->get(x);
	}
}t;
bool cmp(pii a,pii b){return a.f<b.f;}
int32_t main(){
	fastio
	cin>>X>>n>>m>>W>>T;
	for(int i=1;i<=n;i++)cin>>S[i];
	sort(S+1,S+n+1);
	vector<pii>pass(m);
	for(auto &i:pass)cin>>i.f>>i.s;
	sort(all(pass));
	for(int i=1;i<=m;i++){
		D[i]=pass[i-1].f;
		C[i]=pass[i-1].s+C[i-1];
		pref[i]=inf;
	}
	S[n+1]=X;
	for(int i=1;i<=n+1;i++){
		auto it=upper_bound(all(pass),make_pair(S[i]%T,0),cmp)-pass.begin()-1;
		if(it<0||(pass[it]).f>(S[i]%T))continue;
		pref[it+1]=min(pref[it+1],S[i]);
	}
	dp[0]=W*(1+(X/T));
	for(int i=1;i<=m;i++){
		t.add((line){(1-i)*W,dp[i-1]-C[i-1]});
		dp[i]=dp[i-1]+(W*(1+((X-D[i])/T)));
		if(pref[i]==inf)continue;
		dp[i]=min(dp[i],t.qry((pref[i]/T))+((pref[i]/T)*i*W)+C[i]);
	}
	cout<<dp[m];
}
/*
*/

컴파일 시 표준 에러 (stderr) 메시지

coach.cpp: In function 'void setIO(std::string)':
coach.cpp:27:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   27 |         freopen((name+".in").c_str(),"r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
coach.cpp:28:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   28 |         freopen((name+".out").c_str(),"w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...