답안 #186825

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
186825 2020-01-12T10:39:20 Z AlexPop28 Toll (BOI17_toll) C++11
0 / 100
206 ms 47840 KB
#include <bits/stdc++.h>
#define dbg() cerr <<
#define name(x) (#x) << ": " << (x) << ' ' <<
// a duoa zi dupa 11 ore de somn merge mai bine garantez eu

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 - 1) / k;
  int log_groups = 32 - __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 - 1) / k; ++from) {
      int lim = k;
      if ((from / k + (1 << p)) == (n - 1) / k) lim = (n - 1) % k;
      for (int to = 0; to < lim; ++to) {
        int gr = from / k + (1 << (p - 1));
        int lst = min((gr + 1) * k, n);
        for (int x = gr * k, r = 0; x < lst; ++x, ++r) {
          dist[p][from][to] = min(dist[p][from][to],
            dist[p - 1][from][r] + dist[p - 1][x][to]);
        }
      }
    }
  }

  function<int(int, int, int)> GetCost = [&](int from, int to, int max_bit) {
    int ans = INF;
    for (int bit = max_bit - 1; bit >= 0; --bit) {
      int gr = from / k + (1 << bit);
      if (gr > to / k) continue;
      if (gr == to / k) {
        return dist[bit][from][to % k];
      }
      for (int x = gr * k, r = 0; x < (gr + 1) * k; ++x, ++r) {
        int res = dist[bit][from][r];
        if (res == INF) continue;
        res += GetCost(x, to, bit - 1);
        ans = min(ans, res);
      }
      break; 
    }
    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 146 ms 47840 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 206 ms 46936 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 146 ms 47840 KB Output isn't correct
2 Halted 0 ms 0 KB -