Submission #1243489

#TimeUsernameProblemLanguageResultExecution timeMemory
1243489meisgoodSalesman (IOI09_salesman)C++20
100 / 100
1105 ms59120 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
vector <pair<int,int>> v[500003] ;
struct segt {
  int seg[2000003] ;
  void build(){
    for (int i = 0 ; i < 2000003 ; i ++) seg[i]=-LLONG_MAX/4 ;
  }
  void upd(int id,int l,int r,int x,int v){
    if (l==r&&l==x) seg[id]=max(seg[id],v) ;
    else if (l>x||r<x) ;
    else {
      int md=(l+r)/2 ;
      upd(id*2,l,md,x,v) ;
      upd(id*2+1,md+1,r,x,v) ;
      seg[id]=max(seg[id*2],seg[id*2+1]) ;
    }
  }
  int qq(int id,int l,int r,int ql,int qr){
    if (ql<=l&&r<=qr) return seg[id] ;
    else if (l>qr||r<ql) return -LLONG_MAX/4 ;
    else {
      int md=(l+r)/2 ;
      return max(qq(id*2,l,md,ql,qr),qq(id*2+1,md+1,r,ql,qr)) ;
    }
  }
} ;
const int m=500001 ;
signed main() {
  int n,u,d,s,i,j ;
  cin >> n >> u >> d >> s ;
  u=-u,d=-d ;
  for (i = 0 ; i < n ; i ++){
    int a,b,c ;
    cin >> a >> b >> c ;
    v[a].push_back({b,c}) ;
  }
  v[500001].push_back({s,0}) ;
  segt ups,dos ;
  ups.build() ;
  dos.build() ;
  ups.upd(1,1,m,s,d*(m-s)) ;
  dos.upd(1,1,m,s,u*s) ;
  for (i = 1 ; i <= 500001 ; i ++){
    if (v[i].size()==0) ;
    // else if (v[i].size()==1){
      
    // }
    else {
      sort(v[i].begin(),v[i].end(),greater<pair<int,int>>()) ;
      int mx=-LLONG_MAX/4 ;
      vector <pair<int,int>> vvv ;
      int nw=0 ;
      for (auto [a,b] : v[i]){
        mx=max(mx,ups.qq(1,1,m,1,a)-d*(m-a)+u*a-nw) ;
        mx=max(mx,dos.qq(1,1,m,a,m)-u*a+u*a-nw) ;
        nw+=b ;
        vvv.push_back({a,mx-u*a+nw}) ;
      }
      reverse(v[i].begin(),v[i].end()) ;
      mx=-LLONG_MAX/4 ;
      vector <pair<int,int>> vvv2 ;
      nw=0 ;
      for (auto [a,b] : v[i]){
        mx=max(mx,dos.qq(1,1,m,a,m)-u*a+d*(m-a)-nw) ;
        mx=max(mx,ups.qq(1,1,m,1,a)-d*(m-a)+d*(m-a)-nw) ;
        nw+=b ;
        // cout << mx << endl ;
        vvv2.push_back({a,mx-d*(m-a)+nw}) ;
      }
      for (auto [a,b] : vvv){
        ups.upd(1,1,m,a,b+d*(m-a)) ;
        dos.upd(1,1,m,a,b+u*a) ;
      }
      for (auto [a,b] : vvv2){
        ups.upd(1,1,m,a,b+d*(m-a)) ;
        dos.upd(1,1,m,a,b+u*a) ;
      }
      // for (auto [a,b] : v[i]) cout << ups.qq(1,1,m,a,a)-d*(m-a) << " " ; cout << endl ;
    }
  }
  cout << ups.qq(1,1,m,s,s)-d*(m-s) << endl ;
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...