Submission #395330

# Submission time Handle Problem Language Result Execution time Memory
395330 2021-04-28T08:34:25 Z MarcoMeijer Salesman (IOI09_salesman) C++14
100 / 100
2148 ms 44116 KB
#include <bits/stdc++.h>
using namespace std;
 
// macros
typedef long long ll;
typedef long double ld;
typedef pair<int, int> ii;
typedef pair<ll, ll> lll;
typedef tuple<int, int, int> iii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<iii> viii;
typedef vector<ll> vll;
typedef vector<lll> vlll;
#define REP(a,b,c) for(int a=int(b); a<int(c); a++)
#define RE(a,c) REP(a,0,c)
#define RE1(a,c) REP(a,1,c+1)
#define REI(a,b,c) REP(a,b,c+1)
#define REV(a,b,c) for(int a=int(c-1); a>=int(b); a--)
#define FOR(a,b) for(auto& a : b)
#define all(a) a.begin(), a.end()
#define INF 1e18
#define EPS 1e-9
#define pb push_back
#define popb pop_back
#define fi first
#define se second
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
 
// input
template<class T> void IN(T& x) {cin >> x;}
template<class H, class... T> void IN(H& h, T&... t) {IN(h); IN(t...); }
 
// output
template<class T1, class T2> void OUT(const pair<T1,T2>& x);
template<class T> void OUT(const vector<T>& x);
template<class T> void OUT(const T& x) {cout << x;}
template<class H, class... T> void OUT(const H& h, const T&... t) {OUT(h); OUT(t...); }
template<class T1, class T2> void OUT(const pair<T1,T2>& x) {OUT(x.fi,' ',x.se);}
template<class T> void OUT(const vector<T>& x) {RE(i,x.size()) OUT(i==0?"":" ",x[i]);}
template<class... T> void OUTL(const T&... t) {OUT(t..., "\n"); }
template<class H> void OUTLS(const H& h) {OUTL(h); }
template<class H, class... T> void OUTLS(const H& h, const T&... t) {OUT(h,' '); OUTLS(t...); }
 
// dp
template<class T> bool ckmin(T&a, T&b) { bool bl = a > b; a = min(a,b); return bl;}
template<class T> bool ckmax(T&a, T&b) { bool bl = a < b; a = max(a,b); return bl;}
 
void program();
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    program();
}
 
 
//===================//
//   begin program   //
//===================//
 
const int MX = 5e5+5;
const int N = (1<<19);

int n, u, d, s;

struct Seg {
    ll SEG[N*2];
    Seg() {
        RE(i,N*2) SEG[i] = -INF;
    }
    void set(int x, ll v, int l=0, int r=N-1, int p=1) {
        if(x < l || x > r) return;
        SEG[p] = max(SEG[p], v);
        if(l == r) return;
        int m=(l+r)/2;
        set(x,v,l  ,m,p*2  );
        set(x,v,m+1,r,p*2+1);
    }
    ll get(int i, int j, int l=0, int r=N-1, int p=1) {
        if(j < l || i > r) return -INF;
        if(i <= l && j >= r) return SEG[p];
        int m = (l+r)/2;
        ll a = get(i,j,l  ,m,p*2  );
        ll b = get(i,j,m+1,r,p*2+1);
        return max(a,b);
    }
} maxUp, maxDown;

vii atTime[MX];

void program() {
    IN(n,u,d,s);
    RE(i,n) {
        ll t, l, m; IN(t,l,m);
        atTime[t].pb({l,m});
    }
    RE(i,MX) sort(all(atTime[i]));
    
    REV(t,0,MX) {
        vlll maxDownAdd, maxUpAdd;
        ll bestUp = -1e18, bestDown = -1e18;

        // fill max down
        bestUp = -1e18;
        REP(i,0,atTime[t].size()) {
            ii p = atTime[t][i];
            ll l = p.fi;
            ll m = p.se;
            ll val = -INF;
            if(l < s) val = max(val, -(s-l)*d);
            else      val = max(val, -(l-s)*u);
            val = max(val, maxUp  .get(0, l  ) - l*u);
            val = max(val, maxDown.get(l, N-1) + l*d);
            val = max(val, bestUp - l*u);
            val += m;
            maxDownAdd.pb({l, val - l*d});
            bestUp = max(bestUp, val + l*u);
        }
        bestDown = -1e18;
        REV(i,0,atTime[t].size()) {
            ii p = atTime[t][i];
            ll l = p.fi;
            ll m = p.se;
            ll val = -INF;
            if(l < s) val = max(val, -(s-l)*d);
            else      val = max(val, -(l-s)*u);
            val = max(val, maxUp  .get(0, l  ) - l*u);
            val = max(val, maxDown.get(l, N-1) + l*d);
            val = max(val, bestDown + l*d);
            val += m;
            maxDownAdd.pb({l, val - l*d});
            bestDown = max(bestDown, val - l*d);
        }

        // fill max up
        bestDown = -1e18;
        REV(i,0,atTime[t].size()) {
            ii p = atTime[t][i];
            ll l = p.fi;
            ll m = p.se;
            ll val = -INF;
            if(l < s) val = max(val, -(s-l)*d);
            else      val = max(val, -(l-s)*u);
            val = max(val, maxUp  .get(0, l  ) - l*u);
            val = max(val, maxDown.get(l, N-1) + l*d);
            val = max(val, bestDown + l*d);
            val += m;
            maxUpAdd.pb({l, val + l*u});
            bestDown = max(bestDown, val - l*d);
        }
        bestUp = -1e18;
        REP(i,0,atTime[t].size()) {
            ii p = atTime[t][i];
            ll l = p.fi;
            ll m = p.se;
            ll val = -INF;
            if(l < s) val = max(val, -(s-l)*d);
            else      val = max(val, -(l-s)*u);
            val = max(val, maxUp  .get(0, l  ) - l*u);
            val = max(val, maxDown.get(l, N-1) + l*d);
            val = max(val, bestUp - l*u);
            val += m;
            maxUpAdd.pb({l, val + l*u});
            bestUp = max(bestUp, val + l*u);
        }

        FOR(p,maxDownAdd) maxDown.set(p.fi,p.se);
        FOR(p,maxUpAdd  ) maxUp  .set(p.fi,p.se);

        atTime[t].clear();
    }

    ll ans = 0;
    ans = max(ans, maxUp  .get(0,s  ) - s*u);
    ans = max(ans, maxDown.get(s,N-1) + s*d);
    OUTL(ans);
}
# Verdict Execution time Memory Grader output
1 Correct 20 ms 28364 KB Output is correct
2 Correct 20 ms 28392 KB Output is correct
3 Correct 23 ms 28404 KB Output is correct
4 Correct 26 ms 28540 KB Output is correct
5 Correct 35 ms 28620 KB Output is correct
6 Correct 92 ms 29004 KB Output is correct
7 Correct 214 ms 29948 KB Output is correct
8 Correct 394 ms 31588 KB Output is correct
9 Correct 579 ms 33156 KB Output is correct
10 Correct 1002 ms 37852 KB Output is correct
11 Correct 1196 ms 37860 KB Output is correct
12 Correct 1542 ms 41032 KB Output is correct
13 Correct 1539 ms 40984 KB Output is correct
14 Correct 2075 ms 44112 KB Output is correct
15 Correct 1822 ms 44116 KB Output is correct
16 Correct 2148 ms 44108 KB Output is correct
17 Correct 23 ms 28416 KB Output is correct
18 Correct 22 ms 28492 KB Output is correct
19 Correct 23 ms 28496 KB Output is correct
20 Correct 28 ms 28524 KB Output is correct
21 Correct 30 ms 28512 KB Output is correct
22 Correct 33 ms 28620 KB Output is correct
23 Correct 34 ms 28492 KB Output is correct
24 Correct 40 ms 28560 KB Output is correct
25 Correct 351 ms 29892 KB Output is correct
26 Correct 662 ms 33016 KB Output is correct
27 Correct 1148 ms 40356 KB Output is correct
28 Correct 1245 ms 36548 KB Output is correct
29 Correct 1626 ms 34108 KB Output is correct
30 Correct 1594 ms 42172 KB Output is correct