답안 #492547

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
492547 2021-12-07T20:55:21 Z Alex_tz307 치료 계획 (JOI20_treatment) C++17
0 / 100
162 ms 11136 KB
#include <bits/stdc++.h>

using namespace std;

const int kM = 1e5;
const int INF = 2e9 + 1;
const pair<int, int> pINF = {INF, INF};
const int INFL = 1e18L;
int t[1 + kM], tt[1 + kM], l[1 + kM], r[1 + kM], c[1 + kM];
pair<int, int> a[1 + kM];
int64_t dp[1 + kM];

struct ST {
  int n;
  vector<pair<int, int>> t;

  ST(int N) : n(N) {
    int dim = 1;
    while (dim < n) {
      dim <<= 1;
    }
    t.resize(dim << 1, pINF);
  }

  void update(int x, int lx, int rx, int pos, pair<int, int> v) {
    if (lx == rx) {
      t[x] = v;
      return;
    }
    int mid = (lx + rx) >> 1;
    if (pos <= mid) {
      update(x << 1, lx, mid, pos, v);
    } else {
      update(x << 1 | 1, mid + 1, rx, pos, v);
    }
    t[x] = min(t[x << 1], t[x << 1 | 1]);
  }

  void update(int pos, pair<int, int> v) {
    update(1, 1, n, pos, v);
  }

  pair<int, int> query(int x, int lx, int rx, int st, int dr) {
    if (st <= lx && rx <= dr) {
      return t[x];
    }
    int mid = (lx + rx) >> 1;
    pair<int, int> ans1 = pINF, ans2 = pINF;
    if (st <= mid) {
      ans1 = query(x << 1, lx, mid, st, dr);
    }
    if (mid + 1 <= dr) {
      ans2 = query(x << 1 | 1, mid + 1, rx, st, dr);
    }
    return min(ans1, ans2);
  }

  pair<int, int> query(int st, int dr) {
    return query(1, 1, n, st, dr);
  }
};

void testCase() {
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= m; ++i) {
    cin >> t[i] >> l[i] >> r[i] >> c[i];
    ++r[i];
    a[i] = make_pair(t[i], i);
  }
  sort(a + 1, a + m + 1);
  for (int i = 1; i <= m; ++i) {
    tt[a[i].second] = i;
  }
  priority_queue<pair<int64_t, int>, vector<pair<int64_t, int>>, greater<pair<int64_t, int>>> pq;
  ST t1(m), t2(m);
  for (int i = 1; i <= m; ++i) {
    dp[i] = INFL;
    if (l[i] == 1) {
      dp[i] = c[i];
      pq.emplace(dp[i], i);
    } else {
      t1.update(tt[i], {l[i] - t[i], i});
      t2.update(tt[i], {l[i] + t[i], i});
    }
  }
  while (!pq.empty()) {
    int u = pq.top().second;
    pq.pop();
    int v = t1.query(1, tt[u]).second;
    while (v != INF && l[v] - t[v] <= r[u] - t[u]) {
      t1.update(tt[v], pINF);
      t2.update(tt[v], pINF);
      pq.emplace(dp[v] = dp[u] + c[v], v);
      v = t1.query(1, tt[u]).second;
    }
    v = t2.query(tt[u], m).second;
    while (v != INF && l[v] + t[v] <= r[u] + t[u]) {
      t1.update(tt[v], pINF);
      t2.update(tt[v], pINF);
      pq.emplace(dp[v] = dp[u] + c[v], v);
      v = t2.query(tt[u], m).second;
    }
  }
  int64_t ans = INF;
  for (int i = 1; i <= m; ++i) {
    if (r[i] == n + 1) {
      ans = min(ans, dp[i]);
    }
  }
  if (ans == INF) {
    cout << "-1\n";
  } else {
    cout << ans << '\n';
  }
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int tests = 1;
  for (int tc = 0; tc < tests; ++tc) {
    testCase();
  }
  return 0;
}

Compilation message

treatment.cpp:8:18: warning: overflow in conversion from 'long double' to 'int' changes value from '1.0e+18l' to '2147483647' [-Woverflow]
    8 | const int INFL = 1e18L;
      |                  ^~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 162 ms 11136 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 332 KB Output is correct
2 Correct 0 ms 332 KB Output is correct
3 Correct 1 ms 320 KB Output is correct
4 Incorrect 0 ms 332 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 332 KB Output is correct
2 Correct 0 ms 332 KB Output is correct
3 Correct 1 ms 320 KB Output is correct
4 Incorrect 0 ms 332 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 162 ms 11136 KB Output isn't correct
2 Halted 0 ms 0 KB -