# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
931586 | moonrabbit2 | Salesman (IOI09_salesman) | C++17 | 187 ms | 39508 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif
using ll=long long;
using pii=array<int,2>;
using tii=array<int,3>;
const int N=5e5+5;
int n,s;
tii a[N];
ll U,D,S[N],d[N],dp[N];
struct Seg{
ll F[N]={0};
void init(){
for(int i=1;i<=500001;i++) F[i]=-1e18;
}
void upd(int i,ll v){
for(;i<=500001;i+=i&-i) F[i]=max(F[i],v);
}
ll qry(int i){
ll r=-1e18;
for(;i;i-=i&-i) r=max(r,F[i]);
return r;
}
}T1,T2;
int main(){
ios::sync_with_stdio(false); cin.tie(0);
cin>>n>>U>>D>>s;
for(int i=1;i<=n;i++) cin>>a[i][0]>>a[i][1]>>a[i][2];
sort(a+1,a+1+n);
a[++n]={1000000000,s,0};
T1.init(); T2.init();
T1.upd(s,D*s); T2.upd(500002-s,-U*s);
for(int l=1;l<=n;l++){
int r=l;
while(r+1<=n&&a[l][0]==a[r+1][0]) r++;
ll mx=-1e18;
S[l-1]=0;
for(int i=l;i<=r;i++) S[i]=S[i-1]+a[i][2];
for(int i=l;i<=r;i++) d[i]=max(T1.qry(a[i][1])-D*a[i][1],T2.qry(500002-a[i][1])+U*a[i][1]);
for(int i=r;i>=l;i--){
mx=max(mx,d[i]-U*a[i][1]+S[i]);
dp[i]=mx+U*a[i][1]-S[i-1];
debug(i,dp[i]);
}
mx=-1e18;
for(int i=l;i<=r;i++){
mx=max(mx,d[i]+D*a[i][1]-S[i-1]);
dp[i]=max(dp[i],mx-D*a[i][1]+S[i]);
}
for(int i=l;i<=r;i++){
T1.upd(a[i][1],dp[i]+D*a[i][1]);
T2.upd(500002-a[i][1],dp[i]-U*a[i][1]);
}
assert(l==r);
l=r;
}
cout<<dp[n];
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |