题意:给定一些点,点有值,现在3种操作交换行,列,询问某个点值
思路:这是签到题,坐标系很大,所以把坐标离散化储存,每次交换的时候只要把相应的行列坐标交换即可,查询就在交换过的上面查就可以了
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
#define MP(a,b) make_pair(a,b)
typedef pair<int, int> pii;
int t, n, m, k, xn, yn;
map<pii, int> val;
map<int, int> X;
map<int, int> Y;
void add(map<int, int> &X, int x, int &xn) {
if (X.count(x)) return;
X[x] = xn++;
}
int main() {
int cas = 0;
scanf("%d", &t);
while (t--) {
val.clear();
X.clear();
Y.clear();
xn = yn = 0;
scanf("%d%d%d", &n, &m, &k);
int x, y, v;
while (k--) {
scanf("%d%d%d", &x, &y, &v);
add(X, x, xn);
add(Y, y, yn);
val[MP(X[x],Y[y])] = v;
}
scanf("%d", &k);
int q, a, b;
printf("Case #%d:\n", ++cas);
while (k--) {
scanf("%d%d%d", &q, &a, &b);
if (q == 1) {
add(X, a, xn);
add(X, b, xn);
swap(X[a], X[b]);
}
else if (q == 2) {
add(Y, a, yn);
add(Y, b, yn);
swap(Y[a], Y[b]);
}
else {
if (val.count(MP(X[a], Y[b])))
printf("%d\n", val[MP(X[a],Y[b])]);
else
printf("0\n");
}
}
}
return 0;
}HDU 4941 Magical Forest(离散化),布布扣,bubuko.com
原文:http://blog.csdn.net/accelerator_/article/details/38524113