HDU 4941 Magical Forest (Hash)
这个题比赛的时候是乱搞的,比赛结束之后学长说是映射+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)的更多相关文章
- hdu 4941 Magical Forest
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4941 Magical Forest Description There is a forest can ...
- STL : map函数的运用 --- hdu 4941 : Magical Forest
Magical Forest Time Limit: 24000/12000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- hdu 4941 Magical Forest (map容器)
Magical Forest Time Limit: 24000/12000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- HDU 4941 Magical Forest(map映射+二分查找)杭电多校训练赛第七场1007
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941 解题报告:给你一个n*m的矩阵,矩阵的一些方格中有水果,每个水果有一个能量值,现在有三种操作,第 ...
- HDU 4941 Magical Forest 【离散化】【map】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941 题目大意:给你10^5个点.每一个点有一个数值.点的xy坐标是0~10^9.点存在于矩阵中.然后 ...
- HDU 4941 Magical Forest(2014 Multi-University Training Contest 7)
思路:将行列离散化,那么就可以用vector 存下10W个点 ,对于交换操作 只需要将行列独立分开标记就行 . r[i] 表示第 i 行存的是 原先的哪行 c[j] 表示 第 j ...
- HDU 4941 Magical Forest --STL Map应用
题意: 有n*m个格子(n,m <= 2*10^9),有k(k<=10^5)个格子中有值,现在有三种操作,第一种为交换两行,第二种为交换两列,交换时只有两行或两列都有格子有值或都没有格子有 ...
- 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 ...
- hdu4941 Magical Forest (stl map)
2014多校7最水的题 Magical Forest Magical Forest Time Limit: 24000/12000 MS (Java/Others) Memory Limit ...
随机推荐
- Windows 10 秋季更新错误
uefi 启动丢失修复 bcdboot c:\windows /s y: /f uefi /l zh-cn 0x80240034 你尝试安装的内部版本是有签名的外部测试版.若要继续安装,请启用外部测试 ...
- ASP.NET 让ajax请求webform后台方法
$.ajax({ type: "POST", url: ".aspx/getSubjectDirection", data: JSON.stringify({ ...
- c#0218-命名空间
1 namespace 命名空间 可以解决类的重命名问题 可以看做是类的文件夹: 2 跨项目使用类 一个解决方案下有不同的项目,如果想在一个项目中引用另一个项目的类,解决方法是 1 添加引用 2 引用 ...
- swift 20 - Nested Types
Nested Types 只是为了方便类型的整合和使用 struct BlackjackCard { // nested Suit enumeration enum Suit: Character { ...
- SAI 绘画一个卡通动漫人物详解
本教程介绍使用SAI 绘画一个卡通漫画人物教程 ,教程很详细,动起你的小手一起来试试吧! 软件下载:http://www.dongmansoft.com/xiazai.html
- iOS开发——GCD总结
Grand Central Dispatch,简称GCD,在异步执行任务的技术之一. 一般将应用程序中记述的线程管理用的代码在系统级中实现,开发者只需要定义想执行的任务并追加到适当的Dispatch ...
- [LOJ2422]【NOIP2015】斗地主
大名鼎鼎的NOIP2015D1T3 题意: 由于一些众所周知的原因,没有完整题面…… 给你一副斗地主的手牌(牌数<=23),问最少要几次能出完: 包含双王,没有癞子,连对要三连对以上,可以直接出 ...
- centos7 jumpserver 部署和使用手册(一)
测试推荐环境 CPU: 64位双核处理器 内存: 4G DDR3 数据库:mysql 版本大于等于 5.6 mariadb 版本大于等于 5.5.6 环境 系统: CentOS 7.2 IP: 192 ...
- Vue异步组件Demo
Vue异步组件Demo 在大型应用中,我们可能需要将应用拆分为多个小模块,按需从服务器下载.为了进一步简化,Vue.js 允许将组件定义为一个工厂函数,异步地解析组件的定义.Vue.js 只在组件需要 ...
- 紫书 例题11-8 UVa 11082(网络流最大流)
这道题的建模真的非常的秀, 非常牛逼. 先讲建模过程.源点到每一行连一条弧, 容量为这一行的和减去列数, 然后每一列到汇点连一条弧, 容量为这一列 的和减去行数, 然后每一行和列之间连一条弧, 容量为 ...