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:
", 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
", mp[mr[x]][mc[y]]);
51         }
52     }
53     return 0;
54 }
原文地址:https://www.cnblogs.com/bfshm/p/3911763.html