# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
137349 | nvmdava | Salesman (IOI09_salesman) | C++17 | 1086 ms | 28676 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define ff first
#define ss second
using namespace std;
#define N 500005
#define pii pair<int, int>
#define inf 2000000005
set<pii> in;
int n, u, d, s, t, l, m;
vector<pii> fair[N];
int dis(int f, int t){
return f <= t ? (t - f) * d : (f - t) * u;
}
int query(int loc){
int res1, res2;
// auto it = in.lower_bound(make_pair(loc, -inf));
auto it = lower_bound(in.begin(), in.end(), make_pair(loc, -inf));
res1 = it == in.end() ? -inf : it -> ss - dis(it -> ff, loc);
res2 = it == in.begin() ? -inf : (--it) -> ss - dis(it -> ff, loc);
return max(res1, res2);
}
void update(int loc, int val){
if(query(loc) >= val) return;
auto it = in.insert({loc, val}).ff;
it++;
while(it != in.end() && it -> ss <= val - dis(loc, it -> ff)) it = in.erase(it);
it--;
while(it != in.begin() && (--it) -> ss <= val - dis(loc, it -> ff)) it = in.erase(it);
}
vector<pii> tmp;
int main(){
scanf("%d%d%d%d", &n, &u, &d, &s);
for(int i = 1; i <= n; i++){
scanf("%d%d%d", &t, &l, &m);
fair[t].push_back({l, m});
}
update(s, 0);
int sz;
for(int i = 1; i < N; i++){
sz = fair[i].size();
if(sz == 0) continue;
tmp.clear();
sort(fair[i].begin(), fair[i].end());
for(int j = 0; j < sz; j++){
int res = fair[i][j].ss + query(fair[i][j].ff);
tmp.push_back({res, res});
}
for(int j = 1; j < sz; j++)
tmp[j].ff = max(tmp[j].ff, tmp[j - 1].ff - dis(fair[i][j - 1].ff, fair[i][j].ff) + fair[i][j].ss);
for(int j = sz - 2; j >= 0; j--)
tmp[j].ss = max(tmp[j].ss, tmp[j + 1].ss - dis(fair[i][j + 1].ff, fair[i][j].ff) + fair[i][j].ss);
for(int j = 0; j < sz; j++)
update(fair[i][j].ff, max(tmp[j].ff, tmp[j].ss));
}
printf("%d", query(s));
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |