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>
using namespace std;
const int maxn = 1e5 + 10;
const long long inf = 1e16;
long long d[maxn];
struct data {
int t, l, r, c;
} a[maxn];
int n;
bool done[maxn];
bool isEdge(data p, data q) {
if(p.t <= q.t) {
return q.l + q.t <= p.r + p.t;
} else {
return q.l - q.t <= p.r - p.t;
}
}
struct ds {
vector <pair <int, int>> t[maxn * 4];
ds () {}
void add(int x, int y, int idx, int c, int b, int e) {
t[c].push_back(make_pair(y, idx));
if(b == e) {
return ;
}
int m = (b + e) >> 1;
int l = c << 1;
int r = l + 1;
if(x <= m) add(x, y, idx, l, b, m);
else add(x, y, idx, r, m + 1, e);
}
void init(int c, int b, int e) {
sort(t[c].begin(), t[c].end(), greater <pair <int, int>> ());
if(b == e) return ;
int m = (b + e) >> 1;
int l = c << 1;
int r = l + 1;
init(l, b, m);
init(r, m + 1, e);
}
void get(int x, int y, int val, vector <int> &v, int c, int b, int e) {
if(x > y) return ;
if(x <= b && e <= y) {
while(!t[c].empty() && t[c].back().first <= val) {
v.push_back(t[c].back().second);
t[c].pop_back();
}
return ;
}
if(y < b || e < x) return ;
int m = (b + e) >> 1;
int l = c << 1;
int r = l + 1;
get(x, y, val, v, l, b, m);
get(x, y, val, v, r, m + 1, e);
}
} S, T;
int main() {
int m;
scanf("%d %d", &n, &m);
map <int, int> cmp;
for(int i = 1; i <= m; i++) {
scanf("%d %d %d %d", &a[i].t, &a[i].l, &a[i].r, &a[i].c);
a[i].l -= 1;
cmp[a[i].t];
}
int idx = 0;
for(auto &i : cmp) i.second = ++idx;
priority_queue <pair <long long, int>,
vector <pair <long long, int>>,
greater <pair <long long, int>>> Q;
for(int i = 1; i <= m; i++) {
if(a[i].l == 0) {
d[i] = a[i].c;
Q.emplace(d[i], i);
} else {
d[i] = inf;
}
S.add(cmp[a[i].t], a[i].l - a[i].t, i, 1, 1, idx);
T.add(cmp[a[i].t], a[i].l + a[i].t, i, 1, 1, idx);
}
S.init(1, 1, idx);
T.init(1, 1, idx);
while(!Q.empty()) {
int node = Q.top().second;
long long dist = Q.top().first;
Q.pop();
if(done[node]) continue;
done[node] = true;
vector <int> v;
S.get(1, cmp[a[node].t], a[node].r - a[node].t, v, 1, 1, idx);
T.get(cmp[a[node].t], idx, a[node].r + a[node].t, v, 1, 1, idx);
for(int i : v) {
if(d[i] > d[node] + a[i].c) {
d[i] = d[node] + a[i].c;
Q.emplace(d[i], i);
}
}
}
long long ans = inf;
for(int i = 1; i <= m; i++) {
if(a[i].r == n) ans = min(ans, d[i]);
}
if(ans == inf) ans = -1;
printf("%lld\n", ans);
return 0;
}
Compilation message (stderr)
treatment.cpp: In function 'int main()':
treatment.cpp:90:15: warning: unused variable 'dist' [-Wunused-variable]
long long dist = Q.top().first;
^~~~
treatment.cpp:64:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d", &n, &m);
~~~~~^~~~~~~~~~~~~~~~~
treatment.cpp:67:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d %d %d", &a[i].t, &a[i].l, &a[i].r, &a[i].c);
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | 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... |