#include<bits/stdc++.h>
using namespace std;
#include "walk.h"
long long min_distance(std::vector<int> x, std::vector<int> h, std::vector<int> l, std::vector<int> r, std::vector<int> y, int s, int g) {
const long long n = (long long)x.size();
const long long m = (long long)l.size();
vector<set<long long>>v(n);
v[g].insert(0);
set<pair<long long,pair<long long,long long>>>connected;
for(long long i = 0 ; i < m ; i++) {
for(long long ii = l[i] ; ii <= r[i] ; ii++) {
if(ii < r[i])
connected.insert({y[i], {ii, ii+1}});
v[ii].insert(y[i]);
}
}
map<pair<long long,long long>,long long>dist;
priority_queue<pair<long long,pair<long long,long long>>>pq;
pq.push({0,{s,0}});
while(!pq.empty()) {
auto node = pq.top();
pq.pop();
auto [i,y] = node.second;
if(i > 0 && v[i-1].count(y) && connected.count({y, {i-1,i}})) {
if((!dist.count({i-1,y}) || dist[{i,y}] + i - x[i-1] < dist[{i-1,y}])) {
dist[{i-1,y}] = dist[{i,y}] + x[i] - x[i-1];
pq.push({-dist[{i-1,y}], {i-1, y}});
}
}
if(i < n-1 && v[i+1].count(y) && connected.count({y, {i,i+1}})) {
if((!dist.count({i+1,y}) || dist[{i,y}] + x[i+1] - i < dist[{i+1,y}])) {
dist[{i+1,y}] = dist[{i,y}] + x[i+1] - x[i];
pq.push({-dist[{i+1,y}], {i+1, y}});
}
}
for(auto it = v[i].begin() ; it != v[i].end() ; it++) {
long long yy = *it;
if(yy > h[i] || y > h[i])
break;
if(!dist[{i,yy}] || dist[{i,y}] + abs(y - yy) < dist[{i,yy}]) {
dist[{i,yy}] = dist[{i,y}] + abs(y - yy);
pq.push({-dist[{i,yy}], {i, yy}});
}
}
}
return dist[{g,0}];
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
308 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
3 |
Incorrect |
1 ms |
212 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
0 ms |
304 KB |
Output is correct |
3 |
Execution timed out |
4067 ms |
92672 KB |
Time limit exceeded |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
4058 ms |
10140 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
4058 ms |
10140 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
308 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
3 |
Incorrect |
1 ms |
212 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |