Submission #407374

#TimeUsernameProblemLanguageResultExecution timeMemory
407374AugustinasJucasSalesman (IOI09_salesman)C++14
60 / 100
1809 ms65536 KiB
#include <bits/stdc++.h> using namespace std; const long long inf = 1e18; struct medis{ struct node{ long long val = -inf; int l, r; }; vector<node> mas; int n; int dbInd = 0; void build(int v){ if(v >= n){ mas[v].l = mas[v].r = dbInd++; }else{ build(v*2); build(v*2+1); mas[v].l = mas[v*2].l; mas[v].r = mas[v*2+1].r; } } medis(int dd){ n = dd; mas.resize(2 * n + 1); build(1); } void change(int v, int l, int r, long long x){ if(l <= mas[v].l && mas[v].r <= r){ mas[v].val = x; }else if(r < mas[v].l || mas[v].r < l){ return; }else{ change(v*2, l, r, x); change(v*2+1, l, r, x); mas[v].val = max(mas[v*2].val, mas[v*2+1].val); } } pair<long long, int> get(int v, int l, int r){ if(l <= mas[v].l && mas[v].r <= r){ return {mas[v].val, mas[v].l}; }else if(r < mas[v].l || mas[v].r < l){ return {-inf, -inf}; }else{ return max(get(v*2, l, r), get(v*2+1, l, r)); } } }; int n, U, D, s; const int dydis = 5e5 + 10; vector<pair<int, int> > fairs[dydis]; long long curAns[dydis]; medis v1(dydis), v2(dydis); void updateCur(int ind, long long x){ curAns[ind] = x; //[curAns[y]+u*y] //cout << ind << " -> " << x << endl; v1.change(1, ind, ind, curAns[ind] + 1ll * U * ind); v2.change(1, ind, ind, curAns[ind] - 1ll * D * ind); } pair<long long, int> fMx1(int l, int r){ //cout << l << "; " << r << " maximumas, pirmame: " << v1.get(1, l, r) << endl; return v1.get(1, l, r); } pair<long long, int> fMx2(int l, int r){ return v2.get(1, l, r); } void daryk(int d){ if(fairs[d].size() == 0) return; int kurMax = -1; int lastFair = -1; long long pref = 0; vector<pair<int, long long> > chang; //cout << "darom " << d << "-aja diena!" << endl; for(auto x : fairs[d]){ long long bv = (kurMax == -1 ? -inf : 1ll * curAns[kurMax] - 1ll * (x.first - kurMax) * U + pref); long long galiBut = fMx1(lastFair+1, x.first-1).first - 1ll * x.first * U; // y(ind) is [last+1; x.first-1], // kad A = curAns[y]-(x.first-y) * u butu didziausias ir A > bv // A = [curAns[y]+u*y] - [x.first*u] // ^^^^^^^^^^^^^ rasti sita max intervale y [last+1; x.first-1] //cout << "bv = " << bv << ", galiButi = " << galiBut <<", pl = " << x.second << endl; chang.push_back({x.first, max(bv, galiBut) + x.second}); if(galiBut > bv){ kurMax = fMx1(lastFair+1, x.first-1).second; pref = 0; } pref += x.second; lastFair = x.first; } lastFair = dydis-1; kurMax = dydis-1; pref = 0; for(int i = (int)fairs[d].size()-1; i > -1; i--){ auto x = fairs[d][i]; long long bv = (kurMax == dydis-1 ? -inf : 1ll * curAns[kurMax] - 1ll * (kurMax - x.first) * D + pref); long long galiBut = fMx2(x.first+1, lastFair-1).first + 1ll * x.first * D; // cout << "FMX2 = " << fMx2(x.first+1, lastFair-1) <<", dar pridesiu " << x.first * D << ", xf = " << x.first << ", d = " << D<<endl; // cout << "bv = " << bv << ", galiButi = " << galiBut <<", pl = " << x.second << endl; // y(ind) is [x.first+1; x.last-1], // kad A = curAns[y]-(y-x.first) * d butu didziausias ir A > bv // A = [curAns[y]-d*y] + [x.first*u] chang.push_back({x.first, max(bv, galiBut) + x.second}); if(galiBut > bv){ kurMax = fMx2(x.first+1, lastFair-1).second; pref = 0; } pref += x.second; lastFair = x.first; } for(auto x : chang){ int ind = x.first; long long val = x.second; // cout << "norim " << ind << " pakeisti i " << val << endl; if(val < curAns[ind]){ continue; } updateCur(ind, val); } } int main(){ cin.tie(NULL); ios_base::sync_with_stdio(false); for(int i = 0; i < dydis; i++) curAns[i] = -inf; cin >> n >> D >> U >> s; updateCur(s, 0); for(int i = 0; i < n; i++){ int t, l, p; cin >> t >> l >> p; fairs[t].push_back({l, p}); } for(int i = 0; i < dydis; i++){ sort(fairs[i].begin(), fairs[i].end()); } for(int i = 0; i < dydis; i++){ daryk(i); } long long ans = 0; for(int i = 0; i < dydis; i++){ ans = max(ans, curAns[i] - 1ll * (s > i ? U : D) * abs(s-i)); } cout << ans; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...