Submission #416237

#TimeUsernameProblemLanguageResultExecution timeMemory
416237Aldas25Long Distance Coach (JOI17_coach)C++14
100 / 100
190 ms23208 KiB
#include <bits/stdc++.h> using namespace std; #define FAST_IO ios_base::sync_with_stdio(0); cin.tie(0) #define FOR(i, a, b) for(int i = (a); i <= (b); i++) #define REP(n) FOR(O, 1, (n)) #define pb push_back #define f first #define s second typedef long double ld; typedef long long ll; typedef pair<int, int> pii; typedef pair<int, pii> piii; typedef vector<int> vi; typedef vector<pii> vii; typedef vector<ll> vl; typedef vector<piii> viii; const int MAXN = 200100, MAXK = 30; //const ll MOD = 998244353; const ll INF = 4e18; const ld PI = asin(1) * 2; struct Line { ll k, b; Line (ll _k, ll _b) : k(_k), b(_b) {} ll operator() (ll x) {return k*x + b;} }; ld intersection (Line a, Line b) { return ((ld)(b.b - a.b)) / ((ld)(a.k - b.k)); } deque<Line> dq; void insertLine (ll k, ll b) { Line nw (k, b); while ((int)dq.size() >= 2 && intersection(nw, dq[(int)dq.size()-2]) <= intersection( dq[(int)dq.size()-1], dq[(int)dq.size()-2])) { dq.pop_back(); } dq.push_back(nw); } ll get (ll x) { if ((int)dq.size() == 1) return dq[0](x); int le = 0, ri = (int)dq.size()-2; while (le < ri) { int mid = (le+ri+1)/2; if (intersection(dq[mid], dq[mid+1]) < x) le = mid; else ri = mid-1; } return min (dq[le](x), dq[le+1](x)); } ll x, n, m, w, t; ll s[MAXN]; vector<pair<ll, ll>> tmp; ll firstStop[MAXN]; ll dp[MAXN][2]; ll d[MAXN], c[MAXN]; ll prefC[MAXN]; ll waterDrunk[MAXN]; int main() { FAST_IO; cin >> x >> n >> m >> w >> t; //cout << " x=" << x << " n=" << n << " m="<< m << " w=" << w << " t="<< t << endl; FOR(i, 1, n) cin >> s[i]; sort(s+1, s+n+1); s[++n] = x; /// the finish //cout << " n = " << n << " m = " << m << endl; REP(m) { // cout << " here " << endl; ll dd =-1, cc = -1; cin >> dd >> cc; //cout << " dd = " << dd << " cc = " << cc << endl; tmp.pb({dd, cc}); } sort(tmp.begin(), tmp.end()); tmp.pb({0, 0}); /// driver m++; FOR(i, 0, m-1) { d[i+1] = tmp[i].f; c[i+1] = tmp[i].s; } FOR(i, 1, m) prefC[i] = prefC[i-1] + c[i]; FOR(i, 1, n) { ll pos = s[i]%t; ll latest = m; if (d[1] < pos) { int le = 1, ri = m-1; while (le < ri) { int mid = (le+ri+1)/2; if (d[mid] < pos) le = mid; else ri = mid-1; } latest = le; } if (firstStop[latest] == 0) { firstStop[latest] = i; } waterDrunk[i] = (s[i]-1) / t; waterDrunk[i] *= m; waterDrunk[i]++; if(latest < m) waterDrunk[i] += latest; waterDrunk[i] *= w; //cout << " i = " << i << " s="<< s[i] << " waterDrunk = " << waterDrunk[i] << " latest = " << latest << endl; } //FOR(i, 1, m) cout << " i = " << i << " firstStop = " << firstStop[i] << endl; insertLine(0, 0); FOR(i, 1, m) { ll waterThis = (x/t) + (d[i] < (x%t)); waterThis *= w; dp[i][1] = waterThis + min(dp[i-1][0], dp[i-1][1]); dp[i][0] = dp[i][1]; if (firstStop[i] == 0) { //cout << " i = " << i << " d = " << d[i] << " dp0 = dp1 = " << dp[i][1] << " (in cont) " << endl; insertLine(-i, min(dp[i][0], dp[i][1]) - prefC[i]); continue; /// cannot take since d[i-1] is never an end before a stop } /*FOR(j, 0, i-1) { ll water = (s[firstStop[i]] - 1) / t; //water ++; //water *= (ll)(i-j); water *= w; ll cur = -water*j + min(dp[j][0], dp[j][1]) - prefC[j] + prefC[i] + water*i; //dp[i][0] = min(dp[i][0], cur); cout << " i = " << i << " j = " << j << " cur = " << cur << " water = " << water << endl; }*/ ll water = (s[firstStop[i]] - 1) / t; //water ++; //water *= (ll)(i-j); water *= w; ll cur = get(water) + prefC[i] + water*i; dp[i][0] = min(dp[i][0], cur); insertLine(-i, min(dp[i][0], dp[i][1]) - prefC[i]); // cout << " i = " << i << " d = " << d[i] << " dp0 = " << dp[i][0] << " dp1 = " << dp[i][1] << endl; } cout << dp[m][1] << "\n"; return 0; } /* 1000000000000 1 1 1000000 6 999999259244 1 123456789 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...