Submission #381703

#TimeUsernameProblemLanguageResultExecution timeMemory
381703pit4hLong Distance Coach (JOI17_coach)C++14
100 / 100
505 ms33260 KiB
#include<bits/stdc++.h> #define st first #define nd second #define mp make_pair using namespace std; using ll = long long; const int MAXN = 2e5+5, base = (1<<18); int n, m; ll X, w, t; ll s[MAXN]; vector<pair<ll, ll>> arr; ll suf[MAXN]; struct Point { ll x, y; Point() {} Point(ll _x, ll _y) { x = _x, y = _y; } bool operator<(const Point& other) const { return mp(x, y) < mp(other.x, other.y); } }; ll f(Point pt, ll x) { return pt.x * x + pt.y; } Point tree[2*base+1]; map<Point, bool> M; void ins_line(Point line, int id, int rl, int rr) { int rm = (rl+rr)/2; bool check_l = f(line, rl) < f(tree[id], rl); bool check_m = f(line, rm) < f(tree[id], rm); if(check_m) { swap(tree[id], line); } if(rl==rr) return; if(check_l == check_m) { ins_line(line, id*2+1, rm+1, rr); } else { ins_line(line, id*2, rl, rm); } } ll get(int x, int id, int rl, int rr) { int rm = (rl+rr)/2; if(rl==rr) { return f(tree[id], x); } if(x <= rm) { return min(f(tree[id], x), get(x, id*2, rl, rm)); } return min(f(tree[id], x), get(x, id*2+1, rm+1, rr)); } bool cmp(ll item1, ll item2) { return item1%t < item2%t; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>X>>n>>m>>w>>t; for(int i=1; i<2*base; ++i) { tree[i] = Point(1e18/m, 1e18); } for(int i=0; i<n; ++i) { cin>>s[i]; } s[n] = X; sort(s, s+n+1, cmp); arr.resize(m); for(int i=0; i<m; ++i) { cin>>arr[i].st>>arr[i].nd; } sort(arr.begin(), arr.end()); ll sum_c=0; int j = n; for(int i=m-1; i>=0; --i) { while(j>=0 && s[j]%t > arr[i].st) { Point line = Point(-(s[j]/t)*w, (s[j]/t)*w*(i+1) - sum_c + suf[i+1]); if(!M[line]) { ins_line(line, 1, 0, m-1); M[line] = 1; } //cerr<<' '<<line.x<<' '<<line.y<<" "<<f(line, i)<<'\n'; j--; } sum_c += arr[i].nd; suf[i] = suf[i+1] + ((X-arr[i].st)/t+1) * w; suf[i] = min(suf[i], sum_c + get(i, 1, 0, m-1)); //cerr<<i<<": "<<suf[i]<<" "<<suf[i+1] + ((X-arr[i].st)/t+1) * w<<' '<<get(i, 1, 0, m-1)<<'\n'; } cout<<suf[0] + w * (X/t+1)<<'\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...