这个题比赛的时候是乱搞的,比赛结束之后学长说是映射+hash才恍然大悟。因此决定好好学一下hash。

题意:

  M*N的格子,里面有一些格子里面有一个值。

  有三种操作:

    1.交换两行的值。

    2.交换两列的值。

    3.询问某个格子的值。

  保证,交换的时候要么两行都有值,要么两行都为空。

思路:

  其实交换两行或者两列的话,相当于把那两行的对应下标交换一下。因此我们可以想到,对行标和列表建立一个索引,交换的时候,我们只需要交换一下索引。

  因为行和列比较多,所以我们不能直接存整个矩阵,即使离散化也不可以,所以这里我们需要用到hash。(Map也可以)。

代码:

  

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <functional>
#include <time.h> using namespace std; typedef __int64 ll; const int INF = <<;
const int MAXN = (int) 1e5+;
const ll HASH = (ll) (1e6)+; struct node {
int x, y, e;
}a[MAXN]; int hash_table[HASH], next[MAXN]; int d_x[MAXN], d_y[MAXN], len_x, len_y;
int xx[MAXN], yy[MAXN];
int n;
ll mx, my; inline void add(int x, int y, int k) {
int id = ((ll)x*n+y)%HASH;
next[k] = hash_table[id];
hash_table[id] = k;
} inline int find(int x, int y) {
int id = ((ll)x*n+y)%HASH;
int p;
for (p = hash_table[id]; p!=-; p = next[p])
if (a[p].x==x&&a[p].y==y)
return a[p].e;
return ;
} void solve() {
memset(hash_table, -, sizeof(hash_table));
scanf("%d%d%d", &mx, &my, &n);
for (int i = ; i < n; i++) {
scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].e);
d_x[i] = a[i].x;
d_y[i] = a[i].y;
xx[i] = yy[i] = i;
}
sort(d_x, d_x+n);
len_x = unique(d_x, d_x+n) - d_x;
sort(d_y, d_y+n);
len_y = unique(d_y, d_y+n) - d_y;
for (int i = ; i < n; i++) {
a[i].x = lower_bound(d_x, d_x+len_x, a[i].x)-d_x;
a[i].y = lower_bound(d_y, d_y+len_y, a[i].y)-d_y;
add(a[i].x, a[i].y, i);
} int Q, o, x, y;
int rx, ry;
scanf("%d", &Q);
while (Q--) {
scanf("%d%d%d", &o, &x, &y);
if (o==) {
rx = lower_bound(d_x, d_x+len_x, x) - d_x;
ry = lower_bound(d_x, d_x+len_x, y) - d_x;
if (x==d_x[rx]&&y==d_x[ry]) swap(xx[rx], xx[ry]);
} else if (o==) {
rx = lower_bound(d_y, d_y+len_y, x) - d_y;
ry = lower_bound(d_y, d_y+len_y, y) - d_y;
if (x==d_y[rx]&&y==d_y[ry]) swap(yy[rx], yy[ry]);
} else {
rx = lower_bound(d_x, d_x+len_x, x) - d_x;
ry = lower_bound(d_y, d_y+len_y, y) - d_y;
if (x==d_x[rx]&&y==d_y[ry]) printf("%d\n", find(xx[rx], yy[ry]));
else puts("-1");
}
}
} int main() {
#ifdef Phantom01
freopen("HDU4941.in", "r", stdin);
freopen("my4941.txt", "w", stdout);
#endif //Phantom01 int T;
scanf("%d", &T);
for (int i = ; i <= T; i++) {
printf("Case #%d:\n", i);
solve();
} return ;
}

HDU 4941 Magical Forest (Hash)的更多相关文章

  1. hdu 4941 Magical Forest

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4941 Magical Forest Description There is a forest can ...

  2. STL : map函数的运用 --- hdu 4941 : Magical Forest

    Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  3. hdu 4941 Magical Forest (map容器)

    Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  4. HDU 4941 Magical Forest(map映射+二分查找)杭电多校训练赛第七场1007

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941 解题报告:给你一个n*m的矩阵,矩阵的一些方格中有水果,每个水果有一个能量值,现在有三种操作,第 ...

  5. HDU 4941 Magical Forest 【离散化】【map】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941 题目大意:给你10^5个点.每一个点有一个数值.点的xy坐标是0~10^9.点存在于矩阵中.然后 ...

  6. HDU 4941 Magical Forest(2014 Multi-University Training Contest 7)

    思路:将行列离散化,那么就可以用vector 存下10W个点 ,对于交换操作 只需要将行列独立分开标记就行   . r[i] 表示第 i 行存的是 原先的哪行         c[j] 表示 第 j ...

  7. HDU 4941 Magical Forest --STL Map应用

    题意: 有n*m个格子(n,m <= 2*10^9),有k(k<=10^5)个格子中有值,现在有三种操作,第一种为交换两行,第二种为交换两列,交换时只有两行或两列都有格子有值或都没有格子有 ...

  8. hdu 4941 Magical Forest ( 双重map )

    题目链接 题意: 有一个n*m的田地,里边有k棵树,每棵树的位置为(xi,yi),含有能量值ci.之后又q个询问,分三种; 1)1 a b,将a行和b行交换 2)2 a b,将a列和b列交换 3)3 ...

  9. hdu4941 Magical Forest (stl map)

    2014多校7最水的题   Magical Forest Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit ...

随机推荐

  1. navigator.clipboard 浏览器原生剪贴板

    浏览器原生剪贴板 navigator.clipboard 写入 navigator.clipboard.writeText navigator.clipboard.writeText('Linr Te ...

  2. What's new in Safari 11.0

    导语: Safari 11.0 的亮点 网络会议.使用WebRTC标准实现对等会议. 开发调试工具增强.使用用于测量代码和网络性能的新工具来测试代码. WebAssembly.当使用新的WebAsse ...

  3. POJ 2431 Expedition (priority_queue或者multiset可解)

    Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18655   Accepted: 5405 Descr ...

  4. Springboot如何利用http请求控制器

    写好了接口,现在想用postman测试一下这个接口是否正确,想请问怎么传入请求参数?先谢谢了! Springboot如何利用http请求控制器 >> java这个答案描述的挺清楚的:htt ...

  5. windows共享如何重新登录,或用另外的用户登录

    使用net use * /del 可以结束已有的所有连接,或net use \\192.168.1.10  /del可以结束指定连接.比如想重新登录共享的话,就用这个命令结束原来的连接,就可以重新登录 ...

  6. 如何新建一个空的optix工程

    参考链接 1.生成自定义里面添加cuda编译器 2. 修改这几个地方,设定cu文件需要的头文件.输出ptx文件的目录.生成ptx 这样就可以得到ptx了,注意ptx的路径即可 3.添加一些头文件.li ...

  7. js闭包详解-转自好友trigkit4

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 闭包的特性 闭包有三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数 ...

  8. There is no 'root'@'%' registered解决

      把别人机器上的MYSQL中的一个数据库导出来,生成了一个.sql的文件   在我的机器上导入这个.sql文件之后,在数据库连接时出现了如下错误:   “There is no 'root'@'%' ...

  9. li自定义图标

    /*自定义list的图标*/ li{ list-style-image: url(../img/21.JPG); }

  10. Mint-UI 没有样式?

    如果用mint-ui组件,如toast没有样式,是因为没有映入全局样式和导入MintUI 方法如下: 1.安装 npm install mint-ui -S -S表示 --save 2.在main.j ...