一个字,弱。
HDU 4941 Magical Forest
弱弱的我不会用map离散化,自然这道题与我无缘了,看了别人的代码才慢慢理解的。
#include<iostream>
#include<cstdio>
#include<map>
#define maxn 100010
using namespace std;
map<int,int>h;
map<int,int>s;
map<int,int>p;
map<int,int>m[maxn];
int main()
{
int t;
cin>>t;
int u,v,w;
for(int i=1; i<=t; i++)
{
h.clear();
s.clear();
p.clear() ;
cin>>u>>v>>w;
for (int j=0; j<=w; j++) m[j].clear();
printf("Case #%d:\n",i);
for (int d=1; d<=w; d++)
{
int k,l,g;
scanf ("%d%d%d",&k,&l,&g);
k++;//因为本身从0开始,所以++
l++;
h[k]=k;
s[l]=l;
if (p[k]==0)
p[k]=d;//记录第几行
m[p[k]][l]=g;
}
int x;
cin>>x;
while(x--)
{
int tmp,z,c,b;
cin>>z>>c>>b;
c++;
b++;
if(z==1)
{
if(h[c]&&h[b])
{
tmp=h[c];
h[c]=h[b];
h[b]=tmp;
}
}
else if(z==2)
{
if(s[c]&&s[b])
{
tmp=s[c];
s[c]=s[b];
s[b]=tmp;
}
}
else
{
if(h[c]&&s[b]) printf("%d\n",m[p[h[c]]][s[b]]);//通过p[h[c]]来记录实际交换的那个过程
else cout<<"0"<<endl;
}
}
}
return 0;
}