제출 #431619

#제출 시각아이디문제언어결과실행 시간메모리
431619kai824Long Distance Coach (JOI17_coach)C++17
71 / 100
2003 ms16084 KiB
#include<bits/stdc++.h> using namespace std; #define int long long typedef pair<int,int> pii; #define f first #define s second #define mp make_pair int x,n,m,w,t; int arr[200005],vals[200005]; int td[200005];//"time of death" bool die[200005]; pii ppl[200005],kp[200005]; vector<pii> kk; inline int calc(int dj,int cur_time){ return (cur_time/t) + (dj<=(cur_time%t)?1:0); } int32_t main(){ ios_base::sync_with_stdio(false);cin.tie(0); cin>>x>>n>>m>>w>>t; int cost=0; for(int i=0;i<n;i++){//our "kill points" (+ end of journey) cin>>arr[i]; } arr[n++]=x; sort(arr,arr+n); cost+=(x/t)+1;//for the driver for(int i=0;i<m;i++){//passengers... cin>>ppl[i].f>>ppl[i].s; cost+=(x/t); if(ppl[i].f<=(x%t))cost++; } ppl[m++]=mp(0,1e18);//bus driver moment... sort(ppl,ppl+m); for(int i=0;i<m;i++)td[i]=x; for(int i=0;i<n;i++){ kp[i].f=arr[i]%t; kp[i].s=arr[i]; } cost*=w;//base cost... sort(kp,kp+n); for(int i=0;i<n;i++){ if(i>0 && kp[i].f==kp[i-1].f)continue;//if kp at same point, pick the earlier one will do kk.emplace_back(kp[i]); }n=kk.size(); int nex=0;//nex on ppl array int mm=0;//max amt saved... //vals stores amount saved... vals[0]=0; for(int i=0;i<n;i++){ // cout<<kk[i].f<<' '<<kk[i].s<<'\n'; while(nex<m && ppl[nex].f<kk[i].f)nex++; //compute vals[nex-1]: array is for the sake of it... vals[nex-1]=0; int cur=0,it=nex; for(int j=nex-1;j>0;j--){ //add cost saved to cur... if(td[j]<kk[i].s){ break;//previous kill was earlier, and it wasn't worth it... } if(die[j]){ cur+=(calc(ppl[j].f,x)-max(0ll,calc(ppl[j].f,kk[i].s)-1))*w; cur-=(calc(ppl[j].f,x)-max(0ll,calc(ppl[j].f,td[j])-1))*w; }else{ cur+=(calc(ppl[j].f,td[j])-max(0ll,calc(ppl[j].f,kk[i].s)-1))*w; cur-=ppl[j].s;//compensation } // cout<<cur<<' '<<ppl[j].f<<' '<<ppl[j].s<<'\n'; if(cur>vals[nex-1]){ vals[nex-1]=cur; it=j; } } for(int j=it;j<nex;j++){ td[j]=kk[i].s; die[j]=true; } // cout<<nex<<' '<<vals[nex-1]<<' '<<it<<"\n\n"; mm+=(vals[nex-1]); } cout<<cost-mm; 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...