# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
131872 | dragonslayerit | Salesman (IOI09_salesman) | C++14 | 1029 ms | 53240 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cassert>
const long long INF=1e18+7;
int ts[500005];
int ls[500005];
int ms[500005];
long long dp[500005];
std::vector<int> events[500005];
int N;
struct MaxSegTree{
static const int SIZE=500005;
long long st[SIZE*2];
MaxSegTree(){
std::fill(st,st+SIZE*2,-INF);
}
void pull(int i){
st[i]=std::max(st[i<<1],st[i<<1|1]);
}
void set(int i,long long v){
for(st[i+=SIZE]=v;i>1;i>>=1){
pull(i>>1);
}
}
long long query(int a,int b){
long long res=-INF;
for(a+=SIZE,b+=SIZE;a<b;a>>=1,b>>=1){
if(a&1) res=std::max(res,st[a++]);
if(b&1) res=std::max(res,st[--b]);
}
return res;
}
}up,down;
int main(){
int U,D,S;
scanf("%d %d %d %d",&N,&U,&D,&S);
ts[0]=0;
ls[0]=S-1;
ms[0]=0;
for(int i=1;i<=N;i++){
scanf("%d %d %d",&ts[i],&ls[i],&ms[i]);
ls[i]--;
}
ts[N+1]=500001;
ls[N+1]=S-1;
ms[N+1]=0;
for(int i=0;i<=N+1;i++){
events[ts[i]].push_back(i);
}
for(int t=0;t<=500001;t++){
//assert(events[t].size()<=1);
for(int e:events[t]){
int x=ls[e];
dp[e]=ms[e]+std::max(down.query(0,x)-x*D,up.query(x,MaxSegTree::SIZE)+x*U);
if(t==0) dp[e]=0;
down.set(x,dp[e]+x*D);
up.set(x,dp[e]-x*U);
//printf("dp[%d]=%lld\n",e,dp[e]);
}
}
printf("%lld\n",dp[N+1]);
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |