牛客题解 | 交换查询

题目

题目链接

题解:

题目难度:三星

考察点: 哈希表

易错点:

因为\(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",&amp;n,&amp;m,&amp;k);
    for(int i=0;i</p,int></int,int></pair<int,int>
posted @ 2025-03-03 18:39  wangxiaoxiao  阅读(8)  评论(0)    收藏  举报