题意:
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:\n",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\n",mapp[make_pair(xx[a],yy[b])]); break; } } } return 0; }