http://tjuacm.chaosheng.top/problem.php?id=1261
https://vjudge.net/problem/HDU-4941
直接这么写会报错 [Error] size of array 'forest' is too large
const int INF = 0x3f3f3f3f; const int N = 2e9; int n, m, k; int forest[N][N]; int row[N], col[N];
题目中的N, M 太大 所以不能直接记录
用两个map表示,row[i] = j 表示 i行换到了j行,反之同理 col表示列
另外一个map maze记录<i, j>这个位置的值
每次查询前先将正确的行列在row,col中映射。输出答案就可以
参考 https://blog.csdn.net/weixin_52798818/article/details/116310112
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
int n, m, k;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int W;
cin >> W;
for(int tt = 1; tt <= W; tt++){
map<int, map<int, int>> forest;
map<int, int> xm, ym;
cin >> n >> m >> k;
int xa = 0, yb = 0;
int x, y, c;
for(int i = 0; i < k; i++){
cin >> x >> y >> c;
if(xm[x] == 0){
xm[x] = ++xa;
}
if(ym[y] == 0){
ym[y] = ++yb;
}
forest[xm[x]][ym[y]] = c;
}
printf("Case #%d:\n", tt);
int T, q, a, b, res;
cin >> T;
while(T--){
cin >> q >> a >> b;
if(q == 1){
swap(xm[a], xm[b]);
}else if(q == 2){
swap(ym[a], ym[b]);
}else if(q == 3){
res = forest[xm[a]][ym[b]];
printf("%d\n", res);
}
}
}
return 0;
}
京公网安备 11010502036488号