| 比赛 |
期末考试3 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
| 题目名称 |
hope I can jump |
最终得分 |
100 |
| 用户昵称 |
xuyuqing |
运行时间 |
7.554 s |
| 代码语言 |
C++ |
内存使用 |
19.79 MiB |
| 提交时间 |
2026-02-11 10:57:27 |
显示代码纯文本
#include <algorithm>
#include <array>
#include <cstdio>
#include <iostream>
#include <tuple>
#include <vector>
using namespace std;
constexpr int N = 303;
constexpr int Q = 514514;
class fastIn {
private:
char buf [1 << 20];
char *p1 = buf;
char *p2 = buf;
inline char getch ();
public:
template <typename NumT>
void read (NumT &num);
template <typename NumT>
fastIn& operator >> (NumT &num);
};
inline char fastIn::getch () {
if (p1 == p2) {
p1 = buf;
p2 = buf + fread (buf, 1, 1 << 20, stdin);
if (p1 == p2) {
return EOF;
}
}
return *p1++;
}
template <typename NumT>
void fastIn::read (NumT &num) {
char ch = getch ();
NumT op = 1;
num = 0;
while (ch < '0' || '9' < ch) {
op = ((ch == '-') ? -1 : 1);
ch = getch ();
}
while ('0' <= ch && ch <= '9') {
num *= 10;
num += (ch - '0');
ch = getch ();
}
num *= op;
}
template <typename NumT>
fastIn& fastIn::operator >> (NumT &num) {
read (num);
return *this;
}
fastIn fin;
int n;
int q;
using arr = vector<vector<long long>>;
vector<tuple<int, int, int>> ques[N];
long long res[Q];
void solve (int l, int r, arr g) {
if (l == r) {
for (auto [s, t, i] : ques[l]) {
res[i] = g[s][t];
}
return;
}
auto h = g;
int mid = (l + r) / 2;
for (int k = l; k <= mid; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
h[i][j] = min (h[i][j], h[i][k] + h[k][j]);
}
}
}
for (int k = mid + 1; k <= r; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
g[i][j] = min (g[i][j], g[i][k] + g[k][j]);
}
}
}
solve (l, mid, g);
solve (mid + 1, r, h);
}
int main () {
freopen ("hopeicanjump.in", "r", stdin);
freopen ("hopeicanjump.out", "w", stdout);
fin >> n >> q;
arr graph (n + 1, vector<long long> (n + 1));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
fin >> graph[i][j];
}
}
for (int i = 1; i <= q; i++) {
int s, t, p;
fin >> s >> t >> p;
ques[p].emplace_back(s, t, i);
}
solve (1, n, graph);
for (int i = 1; i <= q; i++) {
printf ("%lld\n", res[i]);
}
return 0;
}