首页 > 代码库 > HDU 4941 Magical Forest(离散化)

HDU 4941 Magical Forest(离散化)

HDU 4941 Magical Forest

题目链接

题意:给定一些点,点有值,现在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;
}