首页 > 代码库 > hdu4941 Magical Forest (stl map)

hdu4941 Magical Forest (stl map)

2014多校7最水的题

  Magical Forest

Magical Forest

Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 253    Accepted Submission(s): 120
Problem Description
   There is a forest can be seen as N * M grid. In this forest, there is some magical fruits, These fruits can provide a lot of energy, Each fruit has its location(Xi, Yi) and the energy can be provided Ci.
   However, the forest will make the following change sometimes:       1. Two rows of forest exchange.       2. Two columns of forest exchange.    Fortunately, two rows(columns) can exchange only if both of them contain fruits or none of them contain fruits.
   Your superior attach importance to these magical fruit, he needs to know this forest information at any time, and you as his best programmer, you need to write a program in order to ask his answers quick every time.
 
Input
   The input consists of multiple test cases.
   The first line has one integer W. Indicates the case number.(1<=W<=5)
   For each case, the first line has three integers N, M, K. Indicates that the forest can be seen as maps N rows, M columns, there are K fruits on the map.(1<=N, M<=2*10^9, 0<=K<=10^5)
   The next K lines, each line has three integers X, Y, C, indicates that there is a fruit with C energy in X row, Y column. (0<=X<=N-1, 0<=Y<=M-1, 1<=C<=1000)
   The next line has one integer T. (0<=T<=10^5)    The next T lines, each line has three integers Q, A, B.    If Q = 1 indicates that this is a map of the row switching operation, the A row and B row exchange.    If Q = 2 indicates that this is a map of the column switching operation, the A column and B column exchange.    If Q = 3 means that it is time to ask your boss for the map, asked about the situation in (A, B).    (Ensure that all given A, B are legal. )
 
Output
   For each case, you should output "Case #C:" first, where C indicates the case number and counts from 1.
   In each case, for every time the boss asked, output an integer X, if asked point have fruit, then the output is the energy of the fruit, otherwise the output is 0.
 
Sample Input
13 3 21 1 12 2 253 1 11 1 22 1 23 1 13 2 2
 
Sample Output
Case #1:121
Hint
No two fruits at the same location.
 
Author
UESTC
 
Source
2014 Multi-University Training Contest 7
 
Recommend
We have carefully selected several similar problems for you:  4944 4943 4942 4941 4940 

题意:给出矩阵的长、宽,各个水果的能量、在矩阵中的位置,接下来有t个操作。操作有3种,一种是交换某两列,一种是交换某两行,一种是输出某坐标的水果的能量。矩阵长宽大得飞起,水果最多10^5个。

题解:STL::map

由于地图大得飞起,肯定不能真的存地图,我们建一个map<pair<int,int> , int>把水果的坐标、能量撸进去。然后还有交换行列操作,可以发现这两个操作是独立的,我们可以建立行和列的序号数组,只交换序号就行。但其实行和列也大得飞起,不能真的每行每列都建序号数组,我们也建两个map来存行和列的序号,用来交换。

水得飞起来,我刚开始还想自己写hash,结果写逗乐,发现时限大得飞起,直接用map就过了…

 1 //#pragma comment(linker, "/STACK:102400000,102400000") 2 #include<cstdio> 3 #include<cmath> 4 #include<iostream> 5 #include<cstring> 6 #include<algorithm> 7 #include<cmath> 8 #include<map> 9 #include<set>10 #include<stack>11 #include<queue>12 using namespace std;13 #define ll long long14 #define usint unsigned int15 #define mz(array) memset(array, 0, sizeof(array))16 #define minf(array) memset(array, 0x3f, sizeof(array))17 #define REP(i,n) for(i=0;i<(n);i++)18 #define FOR(i,x,n) for(i=(x);i<=(n);i++)19 #define RD(x) scanf("%d",&x)20 #define RD2(x,y) scanf("%d%d",&x,&y)21 #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)22 #define WN(x) printf("%d\n",x);23 #define RE  freopen("D.in","r",stdin)24 #define WE  freopen("1biao.out","w",stdout)25 26 const int MOD=100007;27 28 struct fruit{29     int r,c,e;30 };31 32 int n,m,k;33 map<int,int>r,c;34 map<pair<int,int>,int>S;35 36 int main(){37     int T,cas=1;38     int q,x,y,i,qn;39     fruit t;40     scanf("%d",&T);41     while(T--){42         scanf("%d%d%d",&n,&m,&k);43         r.clear();44         c.clear();45         S.clear();46         for(i=0;i<k;i++){47             scanf("%d%d%d",&t.r,&t.c,&t.e);48             S[make_pair(t.r,t.c)]+=t.e;49             r[t.r]=t.r;50             c[t.c]=t.c;51         }52         scanf("%d",&qn);53         printf("Case #%d:\n",cas++);54         while(qn--){55             scanf("%d%d%d",&q,&x,&y);56             if(q==1)swap(r[x],r[y]);57             else if(q==2)swap(c[x],c[y]);58             else{59                 printf("%d\n",S[make_pair(r[x],c[y])]);60             }61         }62     }63     return 0;64 }
View Code