牛客题解 | 交换查询
题目
题解:
题目难度:三星
考察点: 哈希表
易错点:
因为\(n\)和\(m\)的范围都有\(10^5\),所以不能直接开成\(n \times m\)的数组,因为这样内存会爆掉,考虑到这是\(k\)最大也只有\(10^5\),说明这是一个比较稀疏的矩阵,因此可以用\(map\)来进行存储。
解法:
定义map<pair<int,int>,int>这样一个数据结构来存储\((x,y)\)方格中的数字\(c\)。定义两个数组\(x\)和\(y\),分别表示行号和列号,初始化行号为\([0,m-1]\),初始化列号为\([0,n-1]\)。
如图所示,每次交换\(2\)行\(a\)和\(b\),实质上相当于交换\(x[a]\)和\(x[b]\)中的值,相当于它们对应的行号发生变化。
同理如图所示,每次交换\(2\)列\(a\)和\(b\),实质上相较于交换\(y[a]\)和\(y[b]\)中的值,相当于它们对应的列号发生变化。
而对于\(query\)操作,只需要查询\(x[a]\)和\(y[b]\)即可,因为在前面的交换中,已经正确完成了行号和列号的对应关系。整个算法时间复杂度为\(O(n)\)
#include "bits/stdc++.h"
using namespace std;
typedef pair<int,int> P;
const int maxn=1e5+10;
int x[maxn],y[maxn];
int n,m,k,c;
map<p,int>mp;
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i</p,int></int,int></pair<int,int>

浙公网安备 33010602011771号