hdu 4941 Magical Forest
题意就是有一片森林 组成是一些网格 在一些点上种果树 果树还有附加的能量值
一开始给出网格大小 以及多少棵果树 下面再给出果树的位置 以及相应的能量值
之后会有三种操作 交换行的操作 交换列的操作 求相应位置上果树的能量值
但是由于N M的上限太大 没办法通过数组的形式存储 因为K的值相对比较小 可以通过map离散化进行存储
进行交换行交换列操作时 交换map映射的值
代码比较好理解 离散化的处理 以及的map的应用 还得强化下
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#include <map>
#define eps 1e-8
#define op operator
#define MOD 10009
#define MAXN 100100
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define FOV(i,a,b) for(int i=a;i>=b;i--)
#define REP(i,a,b) for(int i=a;i<b;i++)
#define REV(i,a,b) for(int i=a-1;i>=b;i--)
#define MEM(a,x) memset(a,x,sizeof a)
#define ll __int64
using namespace std;
map <int,int> row;
map <int,int> col;
map <int,map<int,int> > mp;
int main()
{
//freopen("ceshi.txt","r",stdin);
int tc;
scanf("%d",&tc);
int cnt=1;
while(tc--)
{
row.clear();
col.clear();
mp.clear();
int r=0,co=0;
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
int a,b,c;
int x,y;
for(int i=0;i<k;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(!row[a])
{
row[a]=++r;
x=row[a];
}
else x=row[a];
if(!col[b])
{
col[b]=++co;
y=col[b];
}
else y=col[b];
mp[x][y]=c;
}
scanf("%d",&k);
printf("Case #%d:\n",cnt++);
while(k--)
{
scanf("%d%d%d",&a,&b,&c);
if(a==1)
{
int tmp=row[b];
row[b]=row[c];
row[c]=tmp;
}
else if(a==2)
{
int tmp=col[b];
col[b]=col[c];
col[c]=tmp;
}
else
{
printf("%d\n",mp[row[b]][col[c]]);
}
}
}
return 0;
}