Submission #991202

#TimeUsernameProblemLanguageResultExecution timeMemory
991202model_codeTrain (APIO24_train)C++17
Compilation error
0 ms0 KiB
#include "train.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const int mxN = 1e5 + 10; int n, m, w; const int mxN = 1e5 + 5, mxT = 1e9; const ll inf = 1e18; struct Train { int fr, to, a, b, c, id; } e0[mxN], e1[mxN], e2[mxN]; struct Meal { int l, r; } a[mxN]; ll f[mxN]; int n, m, w, pre[mxN], nxt[mxN], fir[mxN], lst[mxN], cost[mxN]; int c[mxN * 35][2], s[mxN * 35], rt[mxN]; bool operator<(const Meal &x, const Meal &y) { return x.l < y.l; } int getC(int l, int r) { int cnt = 0; for (int i = 0; i < w; i++) { if (a[i].l >= l && a[i].r <= r) cnt++; } return cnt; } struct Event { int id, x, y, t; }; bool operator<(const Event &x, const Event &y) { return x.t > y.t; } priority_queue<Event> qe; int getS(int p, int q, int l, int r, int x, int y) { if (x <= l && r <= y) return s[p] - s[q]; int mid = (l + r) >> 1, res = 0; if (x <= mid) res += getS(c[p][0], c[q][0], l, mid, x, y); if (mid < y) res += getS(c[p][1], c[q][1], mid + 1, r, x, y); return res; } int getKth(int p, int q, int l, int r, int k) { if (s[p] - s[q] < k) return -1; if (l == r) return l; int mid = (l + r) >> 1; if (s[c[p][0]] - s[c[q][0]] >= k) return getKth(c[p][0], c[q][0], l, mid, k); return getKth(c[p][1], c[q][1], mid + 1, r, k - (s[c[p][0]] - s[c[q][0]])); } int Find(int l, int r, int k) { int tl = lower_bound(a, a + W, (Meal){l, 0}); int tr = upper_bound(a, a + W, (Meal){r, 0}) - a - 1; if (k == -1) return getS(rt[tr], (tl ? rt[tl - 1] : 0), 0, mxT, l, r); return getKth(rt[tr], (tl ? rt[tl - 1] : 0), 0, mxT, k); } void Addeve(int pos, int x, int y) { // l 在 e[x].b+1~e[y].b 这一段里面 ll num = (f[y] - f[x] + cost[pos] - 1) / cost[pos]; int u = Find(e[x].b + 1, e[y].b, num); if (u == -1) return; qe.push({pos, x, y, u}); } ll solve(int N, int M, int W, vector<int> T, vector<int> X, vector<int> Y, vector<int> A, vector<int> B, vector<int> C, vector<int> L, vector<int> R) { n = N, m = M, w = W; for (int i = 0; i < n; i++) cost[i] = T[i]; for (int i = 0; i < w; i++) { a[i] = {L[i], R[i]}; } sort(a, a + w); for (int i = 0, x = 0; i < w; i++) { x = rt[i] = Ins(x, 0, mxT, a[i].r); } for (int i = 0; i < m; i++) { e0[i] = e1[i] = e2[i] = {X[i], Y[i], A[i], B[i], C[i], i + 1}; } sort(e1, e1 + m, [](const Train &x, const Train &y) { return x.a < y.a; }); sort(e2, e2 + m, [](const Train &x, const Train &y) { return x.b < y.b; }); ll ans = inf; for (int i = 0, j = 0; i < m; i++) { int x = e1[i].fr; f[e1[i].id] = inf; if (!x) { f[e1[i].id] = e1[i].c + 1ll * Find(0, e1[i].a - 1) * T[0]; } while (j < m && e2[j].b <= e[i].a) { // 加入e2[j] int z = e2[j].id, at = e2[j].to; while (lst[at]) { int p = lst[at]; if (f[p] < f[z]) break; lst[at] = pre[p], nxt[pre[p]] = 0; } pre[z] = lst[at]; if (lst[at]) nxt[lst[at]] = z, Addeve(at, lst[at], z); lst[at] = z; j++; } while (qe.size() && qe.top.t < e1[i].a) { auto [id, xx, yy, t] = qe.top(); qe.pop(); if (nxt[xx] != yy) continue; pre[yy] = pre[xx]; if (!pre[yy]) fir[id] = yy; else { nxt[pre[yy]] = yy; Addeve(id, pre[yy], yy); } } if (fir[x]) { int y = fir[x]; f[e1[i].id] = min(f[e1[i].id], e1[i].c + 1ll * Find(e0[y].b + 1, e1[i].a - 1) * T[x] + f[y]); } if (e1[i].to == n - 1) { ans = min(ans, f[e1[i].id] + 1ll * Find(e1[i].b + 1, mxT) * T[n - 1]); } } if (ans < inf) return ans; return -1; }

Compilation message (stderr)

train.cpp:10:11: error: redefinition of 'const int mxN'
   10 | const int mxN = 1e5 + 5, mxT = 1e9;
      |           ^~~
train.cpp:7:11: note: 'const int mxN' previously defined here
    7 | const int mxN = 1e5 + 10;
      |           ^~~
train.cpp:19:5: error: redefinition of 'int n'
   19 | int n, m, w, pre[mxN], nxt[mxN], fir[mxN], lst[mxN], cost[mxN];
      |     ^
train.cpp:9:5: note: 'int n' previously declared here
    9 | int n, m, w;
      |     ^
train.cpp:19:8: error: redefinition of 'int m'
   19 | int n, m, w, pre[mxN], nxt[mxN], fir[mxN], lst[mxN], cost[mxN];
      |        ^
train.cpp:9:8: note: 'int m' previously declared here
    9 | int n, m, w;
      |        ^
train.cpp:19:11: error: redefinition of 'int w'
   19 | int n, m, w, pre[mxN], nxt[mxN], fir[mxN], lst[mxN], cost[mxN];
      |           ^
train.cpp:9:11: note: 'int w' previously declared here
    9 | int n, m, w;
      |           ^
train.cpp: In function 'int Find(int, int, int)':
train.cpp:49:30: error: 'W' was not declared in this scope
   49 |  int tl = lower_bound(a, a + W, (Meal){l, 0});
      |                              ^
train.cpp: In function 'void Addeve(int, int, int)':
train.cpp:56:15: error: 'e' was not declared in this scope
   56 |  int u = Find(e[x].b + 1, e[y].b, num);
      |               ^
train.cpp: In function 'll solve(int, int, int, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
train.cpp:69:15: error: 'Ins' was not declared in this scope
   69 |   x = rt[i] = Ins(x, 0, mxT, a[i].r);
      |               ^~~
train.cpp:81:53: error: too few arguments to function 'int Find(int, int, int)'
   81 |    f[e1[i].id] = e1[i].c + 1ll * Find(0, e1[i].a - 1) * T[0];
      |                                                     ^
train.cpp:48:5: note: declared here
   48 | int Find(int l, int r, int k) {
      |     ^~~~
train.cpp:83:30: error: 'e' was not declared in this scope
   83 |   while (j < m && e2[j].b <= e[i].a) {
      |                              ^
train.cpp:96:26: error: invalid use of member function 'std::priority_queue<_Tp, _Sequence, _Compare>::const_reference std::priority_queue<_Tp, _Sequence, _Compare>::top() const [with _Tp = Event; _Sequence = std::vector<Event, std::allocator<Event> >; _Compare = std::less<Event>; std::priority_queue<_Tp, _Sequence, _Compare>::const_reference = const Event&]' (did you forget the '()' ?)
   96 |   while (qe.size() && qe.top.t < e1[i].a) {
      |                       ~~~^~~
      |                             ()
train.cpp:96:30: error: expected ')' before 't'
   96 |   while (qe.size() && qe.top.t < e1[i].a) {
      |         ~                    ^
      |                              )
train.cpp:96:30: error: 't' was not declared in this scope
train.cpp:110:70: error: too few arguments to function 'int Find(int, int, int)'
  110 |        min(f[e1[i].id], e1[i].c + 1ll * Find(e0[y].b + 1, e1[i].a - 1) * T[x] + f[y]);
      |                                                                      ^
train.cpp:48:5: note: declared here
   48 | int Find(int l, int r, int k) {
      |     ^~~~
train.cpp:113:60: error: too few arguments to function 'int Find(int, int, int)'
  113 |    ans = min(ans, f[e1[i].id] + 1ll * Find(e1[i].b + 1, mxT) * T[n - 1]);
      |                                                            ^
train.cpp:48:5: note: declared here
   48 | int Find(int l, int r, int k) {
      |     ^~~~