HDU 4941 Magical Forest

题意:

  10^8*10^8个点图上,有一些点及其点值,会进行一些换行换列操作。

  查询其新图上某点值。

思路:

  用map存当前行/列指向原图的哪行/列

  map<pair>存原来图上点值

学到map储存二维的用法。倒是一个方便所在。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>
#include <stack>
#include <queue>
#include <map>
#include <deque>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))

using namespace std;

map<pair<int,int>,int> mapp;
map<int,int> xx;//lie x
map<int,int> yy;//hang y

int tt,t,n,m,k,x,y,c,q,a,b;
int main()
{
    scanf("%d",&tt);
    for(int j=1; j<=tt; j++)
    {
        xx.clear();
        yy.clear();
        mapp.clear();
        printf("Case #%d:
",j);
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1; i<=k; i++)
        {
            scanf("%d%d%d",&x,&y,&c);
            xx[x]=x;
            yy[y]=y;
            mapp[make_pair(x,y)]=c;
        }
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d%d",&q,&a,&b);
            switch(q){
                case 1: 
                        if(xx.find(a)!=xx.end() && xx.find(b)!=xx.end())
                        {
                            int tmp=xx[a]; xx[a]=xx[b]; xx[b]=tmp;
                        }
                    break;
                case 2:
                        if(yy.find(a)!=yy.end() && yy.find(b)!=yy.end())
                        {
                            int tmp=yy[a]; yy[a]=yy[b]; yy[b]=tmp;
                        }
                    break;
                case 3:
                    printf("%d
",mapp[make_pair(xx[a],yy[b])]);
                    break;
            }
        }
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/Mathics/p/3909084.html