# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
159567 | geon040702 | 장애물 경기 (KOI16_dd) | C++14 | 145 ms | 12920 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define MAX 999999999
using namespace std;
struct Item
{
int x, y[2];
bool operator<(const Item &r) const {
return x < r.x;
}
};
int n, start_y, end_x;
Item hurdle[100010];
set< pair<int,int> > data1;
int data2[100010];
void calc_route()
{
int i, j, temp[2];
int ans = MAX, cnt = 0;
set< pair<int, int> >::iterator pos, st, ed;
data1.insert(make_pair(start_y, 0));
for(i = 1 ; i <= n ; i++)
{
temp[0] = temp[1] = MAX;
st = data1.lower_bound(make_pair(hurdle[i].y[0], 0));
ed = data1.upper_bound(make_pair(hurdle[i].y[1], MAX));
for(pos = st; pos != ed ; ++pos)
for(j = 0 ; j <= 1 ; j++)
temp[j] = min(temp[j], (*pos).second + abs(hurdle[i].y[j] - (*pos).first));
data1.erase(st, ed);
for(j = 0 ; j <= 1 ; j++)
data1.insert(make_pair(hurdle[i].y[j], temp[j]));
}
for(pos = data1.begin(); pos != data1.end(); ++pos)
{
if(ans > (*pos).second)
{
ans = (*pos).second;
cnt = 0;
}
if(ans == (*pos).second)
data2[cnt++] = (*pos).first;
}
printf("%d\n%d", ans + end_x, cnt);
for(i = 0 ; i < cnt ; i++)
printf(" %d", data2[i]);
}
int main(void)
{
int i;
scanf("%d %d %d", &n, &start_y, &end_x);
for(i = 1 ; i <= n ; i++)
{
scanf("%d %d %d", &hurdle[i].x, &hurdle[i].y[0], &hurdle[i].y[1]);
}
sort(hurdle+1, hurdle+n+1);
calc_route();
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |