刚刚比赛 T3 玄关求调
  • 板块学术版
  • 楼主Eason_cyx大愚若智
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/9/28 18:02
  • 上次更新2024/9/28 20:20:15
查看原帖
刚刚比赛 T3 玄关求调
741244
Eason_cyx大愚若智楼主2024/9/28 18:02

rt,样例全过,提交只有 33 分。

#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)\Theta(nmq),为啥又 WA 又 TLE 又 MLE。

2024/9/28 18:02
加载中...