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;
using ll = long long;
using pii = pair<int, int>;
using pli = pair<ll, int>;
const ll INF = 1LL * 1e18;
inline int getc(vector<int> &V, int x) { return lower_bound(V.begin(), V.end(), x) - V.begin() + 1; }
ll D[100009];
deque<pii> PT[300009], QT[300009];
int T[100009], L[100009], R[100009], C[100009];
priority_queue<pli> pq;
bool chk[100009];
void updP(int idx, int s, int e, int l, int r, int id) {
if(r < s || e < l) return;
if(l <= s && e <= r) {
PT[idx].push_back({T[id], id});
return;
}
int m = s+e >> 1;
updP(idx*2, s, m, l, r, id);
updP(idx*2+1, m+1, e, l, r, id);
}
void updQ(int idx, int s, int e, int l, int r, int id) {
if(r < s || e < l) return;
if(l <= s && e <= r) {
QT[idx].push_back({T[id], id});
return;
}
int m = s+e >> 1;
updQ(idx*2, s, m, l, r, id);
updQ(idx*2+1, m+1, e, l, r, id);
}
void getP(ll pc, int idx, int s, int e, int p, int t) {
if(p < s || e < p) return;
while(PT[idx].size()) {
int ti, id; tie(ti, id) = PT[idx].back();
if(ti < t) break;
PT[idx].pop_back();
if(chk[id]) continue;
chk[id] = 1;
pq.push({-(pc + C[id]), id});
}
if(s == e) return;
int m = s+e >> 1;
getP(pc, idx*2, s, m, p, t);
getP(pc, idx*2+1, m+1, e, p, t);
}
void getQ(ll pc, int idx, int s, int e, int p, int t) {
if(p < s || e < p) return;
while(QT[idx].size()) {
int ti, id; tie(ti, id) = QT[idx].front();
if(ti > t) break;
QT[idx].pop_front();
if(chk[id]) continue;
chk[id] = 1;
pq.push({-(pc + C[id]), id});
}
if(s == e) return;
int m = s+e >> 1;
getQ(pc, idx*2, s, m, p, t);
getQ(pc, idx*2+1, m+1, e, p, t);
}
int main() {
vector<int> PV, QV;
int N, M; scanf("%d%d",&N,&M);
for(int i=1; i<=M; i++) {
scanf("%d%d%d%d", &T[i], &L[i], &R[i], &C[i]); --L[i];
if(L[i] == 0) {
pq.push({-C[i], i});
chk[i] = 1;
}
PV.push_back(R[i] + T[i]);
QV.push_back(R[i] - T[i]);
}
sort(PV.begin(), PV.end()); PV.resize(unique(PV.begin(), PV.end()) - PV.begin());
sort(QV.begin(), QV.end()); QV.resize(unique(QV.begin(), QV.end()) - QV.begin());
int PM = PV.size(), QM = QV.size();
for(int i=1; i<=M; i++) {
int pl = getc(PV, L[i] + T[i]), pr = getc(PV, R[i] + T[i]);
updP(1, 1, PM, pl, pr, i);
int ql = getc(QV, L[i] - T[i]), qr = getc(QV, R[i] - T[i]);
updQ(1, 1, QM, ql, qr, i);
}
for(int i=1; i<=300000; i++) sort(PT[i].begin(), PT[i].end());
for(int i=1; i<=300000; i++) sort(QT[i].begin(), QT[i].end());
memset(D, -1, sizeof(D));
while(pq.size()) {
ll c; int x; tie(c, x) = pq.top(); pq.pop(); c = -c;
D[x] = c;
getP(c, 1, 1, PM, getc(PV, R[x] + T[x]), T[x]);
getQ(c, 1, 1, QM, getc(QV, R[x] - T[x]), T[x]);
}
ll ans = INF;
for(int i=1; i<=M; i++) if(R[i] == N && D[i] != -1) ans = min(ans, D[i]);
if(ans != INF) printf("%lld", ans);
else puts("-1");
return 0;
}
Compilation message (stderr)
treatment.cpp: In function 'void updP(int, int, int, int, int, int)':
treatment.cpp:22:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
int m = s+e >> 1;
~^~
treatment.cpp: In function 'void updQ(int, int, int, int, int, int)':
treatment.cpp:33:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
int m = s+e >> 1;
~^~
treatment.cpp: In function 'void getP(ll, int, int, int, int, int)':
treatment.cpp:49:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
int m = s+e >> 1;
~^~
treatment.cpp: In function 'void getQ(ll, int, int, int, int, int)':
treatment.cpp:65:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
int m = s+e >> 1;
~^~
treatment.cpp: In function 'int main()':
treatment.cpp:72:17: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
int N, M; scanf("%d%d",&N,&M);
~~~~~^~~~~~~~~~~~~~
treatment.cpp:74:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d%d%d", &T[i], &L[i], &R[i], &C[i]); --L[i];
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | 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... |