这个题比赛的时候是乱搞的,比赛结束之后学长说是映射+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. hiho1079 - 数据结构 线段树(入门题,离散化)

    题目链接 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho所在的学校举办社团文化节,各大社团都在宣传栏上贴起了海报,但是贴来贴去 ...

  2. Caffe Loss分析

    Caffe_Loss 损失函数为深度学习中重要的一个组成部分,各种优化算法均是基于Loss来的,损失函数的设计好坏很大程度下能够影响最终网络学习的好坏.派生于 \(LossLayer\),根据不同的L ...

  3. POJ 2029 Get Many Persimmon Trees 【 二维树状数组 】

    题意:给出一个h*w的矩形,再给出n个坐标,在这n个坐标种树,再给出一个s*t大小的矩形,问在这个s*t的矩形里面最多能够得到多少棵树 二维的树状数组,求最多能够得到的树的时候,因为h,w都不超过50 ...

  4. CDR X6低价还能持续多久?官方回应18年元旦过后要涨价

    目前,CDR X6特价活动,从双十二的到18年的元旦,火热程度一直屡刷新高,究其原因,其实不是大家不需要,只是这个平面设计软件价格实在太高(CDR X8/8200:CDR 2017/9500一套),尤 ...

  5. asp.net core 与EFcore 入门

    什么是EFcore? Entity Framework (EF) Core 是轻量化.可扩展和跨平台版的常用 Entity Framework 数据访问技术,EF Core 可用作对象关系映射程序 ( ...

  6. express + jqPaginator 分页展示内容

    写在前面的话 分页展示内容也是我们在页面开发中经常会遇到的需求 前端页面利用jqPaginator这个jquery插件来编写 后端利用mysql存储数据 开始敲代码 回顾sql知识 首先让我们回顾一下 ...

  7. echars自定义提示框位置

    tooltip: { trigger: 'item', formatter: "{a} <br/>{b}: {c} ({d}%)", position:function ...

  8. 微信小程序 分享海报

    const app = getApp(); const template = require('../../template/templates.js'); Page({ /** * 页面的初始数据 ...

  9. python 面向对象 继承

    什么是继承 继承表达的是一种”是“的关系,比如人是动物 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 继承是基于抽象的结 ...

  10. Android ADB工具-截图和录制视频(五)

    Android ADB工具-截图和录制视频(五) 标签(空格分隔): Android ADB 7. 截图和录制视 命令 功能 adb shell screencap –p <path/file& ...