hdu 4941 Magical Forest ( 双重map )
题意:
有一个n*m的田地,里边有k棵树,每棵树的位置为(xi,yi),含有能量值ci。之后又q个询问,分三种;
1)1 a b,将a行和b行交换
2)2 a b,将a列和b列交换
3)3 a b,询问(a,b)位置的果树的能量值。
分析:由于n和m很大,而k很小,所以可以用map离散化。每次交换行或者列的时候只需交换map映射的值即可。
交换的时候只是交换离散以后的代号就行,mp【】【】里面还是原来的。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <map> 6 #include <algorithm> 7 #define LL __int64 8 using namespace std; 9 10 int main() 11 { 12 int W, n, m, k, tmp; 13 int x, y, c, t, q, ca=1; 14 int cnt_r, cnt_c; 15 scanf("%d", &W); 16 while(W--) 17 { 18 map<int, int>mr, mc; 19 map<int, map<int, int> >mp; //双重map 20 scanf("%d%d%d", &n, &m, &k); 21 cnt_r = 1; 22 cnt_c = 1; 23 while(k--) 24 { 25 scanf("%d%d%d", &x, &y, &c); 26 if(!mr[x]) 27 mr[x] = cnt_r++; //离散化 28 if(!mc[y]) 29 mc[y] = cnt_c++; //离散化 30 mp[mr[x]][mc[y]] = c; 31 } 32 printf("Case #%d:\n", ca++); 33 scanf("%d", &t); 34 while(t--) 35 { 36 scanf("%d%d%d", &q, &x, &y); 37 if(q==1) //行交换 38 { 39 tmp = mr[x]; 40 mr[x] = mr[y]; 41 mr[y] = tmp; 42 } 43 else if(q==2) //列交换 44 { 45 tmp = mc[x]; 46 mc[x] = mc[y]; 47 mc[y] = tmp; 48 } 49 else 50 printf("%d\n", mp[mr[x]][mc[y]]); 51 } 52 } 53 return 0; 54 }