HDU 4941 Magical Forest

题目链接~~>

做题感悟:这题开始看时感觉很难,后来发现行和列没关系,属于有想法的一类的题目。

解题思路:

                 因为所给的数据范围很大,开数组根本开不下,但是一看水果的数量并不大,可以从这里下手。细心观察一下发现行和列是没有关系的,交换行的时候没必要考虑列的感受,反之亦然,这样用map 离散化一下,然后用双重map 标记一个水果的位置,交换的时候只交换映射的值就可以了,其实原先的坐标还对应相应的水果。

代码:

#include<iostream>
#include<fstream>
#include<iomanip>
#include<ctime>
#include<fstream>
#include<sstream>
#include<stack>
#include<cstring>
#include<cmath>
#include<map>
#include<vector>
#include<cstdio>
#include<algorithm>
#define INT long long int
using namespace std ;
const double esp = 0.00000001 ;
const int INF = 1000000000 ;
const int MY = 20 ;
const int MX = (1<<17) + 10 ;
map<int ,int >row ;
map<int ,int >col ;
map<int ,map<int ,int > >m ;
void input()
{
   int nx ,mx ,k ,x ,y ,c ;
   row.clear() ;
   col.clear() ;
   m.clear() ;
   scanf("%d%d%d",&nx ,&mx ,&k) ;
   int rl = 1 ,cl = 1 ;
   for(int i = 0 ;i < k ;i++)
   {
       scanf("%d%d%d" ,&x ,&y ,&c) ;
       if(!row[x])
          row[x] = rl++ ;
       if(!col[y])
          col[y] = cl++ ;
       m[row[x]][col[y]] = c ;
   }
}
void solve()
{
     int T ,temp ,a ,b ,c ;
     scanf("%d" ,&T) ;
     while(T--)
     {
         scanf("%d%d%d" ,&a ,&b ,&c) ;
         if(a == 1)
         {
            temp = row[b] ;
            row[b] = row[c] ;
            row[c] = temp ;
         }
         else if(a == 2)
         {
            temp = col[b] ;
            col[b] = col[c] ;
            col[c] = temp ;
         }
         else if(a == 3)
             cout<<m[row[b]][col[c]]<<endl ;
     }
}
int main()
{
    int Tx,cse=1 ;
    scanf("%d",&Tx) ;
    while(Tx--)
    {
        input() ;
        cout<<"Case #"<<cse++<<":"<<endl ;
        solve() ;
    }
    return 0 ;
}


你可能感兴趣的:(HDU 4941 Magical Forest)