제출 #1264055

#제출 시각아이디문제언어결과실행 시간메모리
1264055DeltaStructSalesman (IOI09_salesman)C++20
60 / 100
576 ms43476 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

signed main(){
  int n,u,d,m,s(5e5+1); cin >> n >> u >> d >> m; --m;
  vector<vector<pair<int,int>>> A(s); for (int i(0),a,b,c;i < n;++i){
    cin >> a >> b >> c; A[a-1].emplace_back(b-1,c);
  }
  A.back().emplace_back(m,0);
  for (auto& B:A) sort(B.begin(),B.end());
  vector<int> up(2*s,-1e18),down(2*s,-1e18);
  for (int i(s+m);i;i>>=1) up[i] = -u*m,down[i] = -d*(n-m);
  auto f = [&](int i) -> int {
    int ret = -1e18;
    for (int l(s),r(s+i);l < r;l>>=1,r>>=1){
      if (l&1) ret = max(ret,down[l++]+d*(n-i));
      if (r&1) ret = max(ret,down[--r]+d*(n-i));
    }
    for (int l(s+i),r(s+s);l < r;l>>=1,r>>=1){
      if (l&1) ret = max(ret,up[l++]+u*i);
      if (r&1) ret = max(ret,up[--r]+u*i);
    }
    return ret;
  };
  for (auto& B:A){
    int q = B.size(); vector<int> C(q),D(q);
    for (int i(0);i < q;++i){
      C[i] = f(B[i].first)+B[i].second;
      if (i) C[i] = max(C[i],C[i-1]+B[i].second);
    }
    for (int i(q-1);i > -1;--i){
      D[i] = f(B[i].first)+B[i].second;
      if (i!=q-1) D[i] = max(D[i],D[i+1]+B[i].second);
    }
    for (int i(0);i < q;++i) for (int k(s+B[i].first);k;k>>=1){
      up[k] = max(up[k],max(C[i],D[i])-u*B[i].first);
      down[k] = max(down[k],max(C[i],D[i])-d*(n-B[i].first));
    }
  }
  cout << up[s+m]+u*m << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...