rt,样例全过,提交只有 3 分。
#include <bits/stdc++.h>
using namespace std;
vector<int> a[100005];
struct Q {
vector<int> d[100005];
} dis[55];
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
int n,m,qq;
queue<pair<pair<int,int>,int>> q;
bool check(int x,int y) { return x >= 1 && x <= n && y >= 1 && y <= m; }
int main() {
cin >> n >> m >> qq;
for(int i = 1;i <= n;i++) {
a[i].resize(m+1);
for(int j = 1;j <= m;j++) {
cin >> a[i][j];
}
}
bool flag = true;
for(int i = 1;i <= n;i++) {
for(int j = 1;j <= m;j++) {
if(a[i][j] >= 0) continue;
for(int k = 0;k < 4;k++) {
int nx = i + dx[k],ny = j + dy[k];
if(!check(nx,ny)) continue;
if(a[nx][ny] < abs(a[i][j]) || a[nx][ny] < 0) {
flag = false; break;
}
}
}
}
if(!flag) {
cout << "No\n";
return 0;
}
for(int i = 1;i <= qq;i++) {
for(int j = 1;j <= n;j++) {
dis[i].d[j].resize(m+1);
for(int k = 1;k <= m;k++) dis[i].d[j][k] = 0x7fffffff;
}
}
for(int i = 1;i <= qq;i++) {
int x,y; cin >> x >> y;
if(qq == 1) {
cout << a[x][y] << endl;
return 0;
}
q.push({{x,y},a[x][y]});
while(!q.empty()) {
pair<pair<int,int>,int> u = q.front(); q.pop();
// cout << i << ' ' << u.first.first << ' ' << u.first.second << ' ' << u.second << endl;
dis[i].d[u.first.first][u.first.second] = min(dis[i].d[u.first.first][u.first.second],u.second);
for(int k = 0;k < 4;k++) {
int nx = u.first.first + dx[k],ny = u.first.second + dy[k];
if(!check(nx,ny)) continue;
if((u.second+a[nx][ny]) <= dis[i].d[nx][ny]) q.push({{nx,ny},u.second+a[nx][ny]});
}
}
}
// for(int j = 1;j <= n;j++) {
// for(int k = 1;k <= m;k++) {
// for(int i = 1;i <= qq;i++) {
// cout << "The " << i << "th person to (" << j << "," << k << ") need " << dis[i].d[j][k] << " value." << endl;
// }
// cout << endl;
// }
// }
int minn = 0x7fffffff;
for(int i = 1;i <= n;i++) {
for(int j = 1;j <= m;j++) {
//全部走到 (i,j)
int ans = -0x7fffffff;
for(int k = 1;k <= qq;k++) {
ans = max(ans,dis[k].d[i][j]);
}
if(ans != -0x7fffffff) minn = min(minn,ans);
}
}
cout << minn << endl;
return 0;
}
自己感觉复杂度是对的啊,Θ(nmq),为啥又 WA 又 TLE 又 MLE。