답안 #185470

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
185470 2020-01-11T21:30:48 Z AlexPop28 Toll (BOI17_toll) C++11
0 / 100
1790 ms 44408 KB
#include <bits/stdc++.h>
#define dbg() cerr <<
#define name(x) (#x) << ": " << (x) << ' ' <<

using namespace std;

const int INF = (int)1e9 + 5;

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);

  int k, n, m, q; cin >> k >> n >> m >> q;
  int groups = n / k;
  int log_groups = 31 - __builtin_clz(groups);
  vector<vector<vector<int>>> dist(log_groups,
    vector<vector<int>>(n,
      vector<int>(k, INF)));
  vector<vector<pair<int, int>>> adj(n);
  for (int i = 0; i < m; ++i) {
    int a, b, c; cin >> a >> b >> c;
    adj[a].emplace_back(b, c);
    adj[b].emplace_back(a, c);
    dist[0][a][b % k] = c;
  }
  for (int p = 1; p < log_groups; ++p) {
    for (int from = 0; from / k + (1 << p) < n; ++from) {
      int lim = from / k + (1 << p);
      lim *= k;
      if (lim >= n) lim %= k;
      else lim = k;
      for (int to = 0; to < lim; ++to) {
        int gr = from / k + (1 << (p - 1)); gr *= k;
        for (int x = gr; x < gr + k; ++x) {
          for (int y = gr + k; y < gr + 2 * k; ++y) {
            dist[p][from][to] = min(dist[p][from][to],
              dist[p - 1][from][x - gr] +
                dist[0][x][y - gr - k] +
                  dist[p - 1][y][to]);
          }
        }
      }
    }
  }

  function<int(int, int, int)> GetCost = [&](int from, int to, int max_bit) {
    int gr_from = from / k, gr_to = to / k;
    if (gr_from + 1 == gr_to) {
      return dist[0][from][to % k];
    }
    int ans = INF;
    for (int bit = max_bit - 1; bit >= 0; --bit) {
      if ((gr_from + (1 << bit)) * k >= n) continue;
      int st = (gr_from + (1 << bit)) * k;
      int lim = st < n ? k : (n - 1) % k + 1;
      for (int x = 0; x < lim; ++x) {
        int curr = dist[bit][from][x];
        if (curr == INF) continue;
        curr += GetCost(x + st, to, bit - 1);
        ans = min(ans, curr);
      }
    }
    return ans;
  };
  
  while (q--) {
    int a, b; cin >> a >> b;
    int ans = GetCost(a, b, log_groups);
    if (ans == INF) ans = -1;
    cout << ans << '\n';
  }
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1790 ms 44408 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1159 ms 43012 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Incorrect 2 ms 376 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Incorrect 2 ms 376 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1790 ms 44408 KB Output isn't correct
2 Halted 0 ms 0 KB -