Submission #390997

#TimeUsernameProblemLanguageResultExecution timeMemory
390997parsabahramiTreatment Project (JOI20_treatment)C++17
100 / 100
2611 ms212776 KiB
/* There's someone in my head but it's not me */ #include <bits/stdc++.h> using namespace std; typedef long long int ll; typedef pair<int, int> pii; #define SZ(x) (int) x.size() #define F first #define S second #define lc id << 1 #define rc lc | 1 const int N = 1e5 + 10; struct ver { int l, r, t, c; }; int n, m, M[N]; ll dp[N]; array<set<pii>, 2> seg[N << 2]; ver A[N]; void build(int id = 1, int l = 1, int r = m + 1) { for (int i = l; i < r; i++) { seg[id][0].insert({A[i].l + A[i].t, i}); seg[id][1].insert({A[i].l - A[i].t, i}); } if (r - l < 2) return; int md = (l + r) >> 1; build(lc, l, md), build(rc, md, r); } void remove(int p, int id = 1, int l = 1, int r = m + 1) { seg[id][0].erase({A[p].l + A[p].t, p}); seg[id][1].erase({A[p].l - A[p].t, p}); if (r - l < 2) return; int md = (l + r) >> 1; if (p < md) remove(p, lc, l, md); else remove(p, rc, md, r); } int get(int ql, int qr, int x, int t, int id = 1, int l = 1, int r = m + 1) { if (qr <= l || r <= ql || seg[id][t].empty() || seg[id][t].begin()->F > x) return -1; if (ql <= l && r <= qr) return seg[id][t].begin()->S; int md = (l + r) >> 1, y; y = get(ql, qr, x, t, lc, l, md); if (~y) return y; return get(ql, qr, x, t, rc, md, r); } int main() { scanf("%d%d", &n, &m); 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].r++; } sort(A + 1, A + m + 1, [&] (const ver &a, const ver &b) { return a.t < b.t; }); build(); fill(dp, dp + N, 1e18); priority_queue<pair<ll, int>> pq; for (int i = 1; i <= m; i++) { if (A[i].l < 2) pq.push({-(dp[i] = A[i].c), i}), remove(i); } while (SZ(pq)) { int v = pq.top().S; pq.pop(); if (M[v]) continue; M[v] = 1; int x = get(1, v, A[v].r - A[v].t, 1); while (~x) { if (dp[x] > dp[v] + A[x].c) dp[x] = dp[v] + A[x].c, pq.emplace(-dp[x], x); remove(x); //printf("%d -> %d\n", v, x); x = get(1, v, A[v].r - A[v].t, 1); } x = get(v + 1, m + 1, A[v].r + A[v].t, 0); while (~x) { if (dp[x] > dp[v] + A[x].c) dp[x] = dp[v] + A[x].c, pq.emplace(-dp[x], x); remove(x); //printf("%d -> %d\n", v, x); x = get(v + 1, m + 1, A[v].r + A[v].t, 0); } } ll ret = 1e18; for (int i = 1; i <= m; i++) if (A[i].r == n + 1) ret = min(ret, dp[i]); printf("%lld\n", ret < 1e18 ? ret : -1); return 0; }

Compilation message (stderr)

treatment.cpp: In function 'int main()':
treatment.cpp:47:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   47 |     scanf("%d%d", &n, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~
treatment.cpp:49:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   49 |         scanf("%d%d%d%d", &A[i].t, &A[i].l, &A[i].r, &A[i].c); A[i].r++;
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...