# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
218154 | arnold518 | Salesman (IOI09_salesman) | C++14 | 834 ms | 54392 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int MAXN = 5e5;
const int MAXVAL = 5e5+10;
const ll NEGINF= -1e17;
struct SEG
{
ll tree[4*MAXVAL+10];
SEG() { for(int i=1; i<=4*MAXVAL; i++) tree[i]=NEGINF; }
void update(int node, int tl, int tr, int pos, ll val)
{
if(tr<pos || pos<tl) return;
if(tl==tr) { tree[node]=max(tree[node], val); return; }
int mid=tl+tr>>1;
update(node*2, tl, mid, pos, val);
update(node*2+1, mid+1, tr, pos, val);
tree[node]=max(tree[node*2], tree[node*2+1]);
}
ll query(int node, int tl, int tr, int l, int r)
{
if(r<tl || tr<l) return NEGINF;
if(l<=tl && tr<=r) return tree[node];
int mid=tl+tr>>1;
return max(query(node*2, tl, mid, l, r), query(node*2+1, mid+1, tr, l, r));
}
void update(int pos, ll val) { update(1, 1, MAXVAL, pos, val); }
ll query(int l, int r) { return query(1, 1, MAXVAL, l, r); }
};
SEG sega, segb;
struct Data
{
int T, L, M;
bool operator < (const Data &p)
{
if(T!=p.T) return T<p.T;
return L<p.L;
}
};
int N, U, D, S;
Data A[MAXN+10];
ll dpl[MAXN+10], dpr[MAXN+10];
int main()
{
int i, j;
scanf("%d%d%d%d", &N, &U, &D, &S);
for(i=1; i<=N; i++) scanf("%d%d%d", &A[i].T, &A[i].L, &A[i].M);
sort(A+1, A+N+1);
sega.update(S, -U*S);
segb.update(S, D*S);
for(i=1; i<=N; )
{
int now=A[i].T;
vector<int> V;
for(; i<=N && now==A[i].T; i++) V.push_back(i);
for(int it : V) dpl[it]=dpr[it]=max(sega.query(A[it].L, MAXVAL)+U*A[it].L, segb.query(1, A[it].L)-D*A[it].L)+A[it].M;
for(j=V.size()-2; j>=0; j--) dpl[V[j]]=max(dpl[V[j]], dpl[V[j+1]]-U*(A[V[j+1]].L-A[V[j]].L)+A[V[j]].M);
for(j=1; j<V.size(); j++) dpr[V[j]]=max(dpr[V[j]], dpr[V[j-1]]-D*(A[V[j]].L-A[V[j-1]].L)+A[V[j]].M);
for(int it : V) sega.update(A[it].L, max(dpl[it], dpr[it])-A[it].L*U), segb.update(A[it].L, max(dpl[it], dpr[it])+A[it].L*D);
}
printf("%lld", max(sega.query(S, MAXVAL)+U*S, segb.query(1, S)-D*S));
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |