果真产生一种是个题就不会做的自我嫌弃的心理是不好的。。
这一题看着很吓人,其实就是一种映射+指针的想法。
因为M,N很大,无法直接存,但是K只有1e5,所以可以只存fruit以及其相对应的行和列。
感觉离散化的意思就是把行和列从0开始按序重新编号。
交换操作就是将原先的行/列对应的离散化后的行/列换一下,改变的是映射关系,注意这里面行操作和列操作是不会相互影响的。
例如原先是r->rx,交换了以后变成r->rx',所以对r的询问就变成了对离散化后的rx'的询问。
原始矩阵和离散化后的矩阵的行和列实际上都没有交换,改变的实际上是映射关系。
#include<iostream> #include<stdio.h> #include<cstdio> #include<stdlib.h> #include<vector> #include<string> #include<cstring> #include<cmath> #include<algorithm> #include<stack> #include<queue> #include <ctype.h> #include<map> #include<time.h> using namespace std; //hdu 4941 //映射 指针 int W; int N; int M; int K; int Q; int T; map<int,int>mr; map<int,int>mc; map<pair<int,int>,int > mp; int main() { freopen("input.txt","r",stdin); // freopen("data.txt","r",stdin); // freopen("out1.txt","w",stdout); scanf("%d",&W); mr.clear(); mc.clear(); mp.clear(); for(int ca=1;ca<=W;ca++) { printf("Case #%d:\n",ca); scanf("%d %d %d",&N,&M,&K); int rr=0; int cc=0; for(int i=0;i<K;i++) { int x,y,c=0; scanf("%d %d %d",&x,&y,&c); if(mr[x]==0) { mr[x]=rr++; } if(mc[y]==0) { mc[y]=cc++; } mp[make_pair(mr[x],mc[y])]=c; } scanf("%d",&T); int a,b=0; while(T--) { scanf("%d %d %d",&Q,&a,&b); if(Q==1) { int tmp=mr[a]; mr[a]=mr[b]; mr[b]=tmp; } else if(Q==2) { int tmp=mc[a]; mc[a]=mc[b]; mc[b]=tmp; } else if(Q==3) { printf("%d\n",mp[make_pair(mr[a],mc[b])]); } } } return 0; }