题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941

解题报告:给你一个n*m的矩阵,矩阵的一些方格中有水果,每个水果有一个能量值,现在有三种操作,第一种是行交换操作,就是把矩阵的两行进行交换,另一种是列交换操作,注意两种操作都要求行或列至少要有一个水果,第三种操作是查找,询问第A行B列的水果的能量值,如果查询的位置没有水果,则输出0.

因为n和m都很大,达到了2*10^9,但水果最多一共只有10^5个,我的做法是直接用结构体存了之后排序,然后map[i] = j,表示当前的i行相当于原地图中的j行,这样进行行交换操作的时候只要交换一下这个就可以了,原地图上的模样不变,列交换同理。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<map>
using namespace std;
#define maxn 100005
struct node
{
int x,y,c;
}mat[maxn];
map<int,int> hang,lie;
bool cmp(node a,node b)
{
if(a.x == b.x) return a.y < b.y;
return a.x < b.x;
}
int query(int k,int x,int y)
{
int l = ,r = k,d = x,m;
while(l < r)
{
m = (l + r) >> ;
if(d <= mat[m].x) r = m;
else l = m + ;
}
int s1 = l;
if(mat[s1].x != x) return ; //没找到一个符合的x,说明没有这一行
l = ,r = k,d = x + ;
while(l < r)
{
m = (l + r) >> ;
if(d <= mat[m].x) r = m;
else l = m + ;
}
int s2 = l;
if(mat[s2].x != x) s2--;
l = s1,r = s2;
while(l < r)
{
m = (l + r) / ;
if(y <= mat[m].y) r = m;
else l = m + ;
}
if(mat[l].y != y) return ; //没找到符合的y,说明这一行的这一列没有
return mat[l].c;
}
int main()
{
int T,n,m,k,q,kase = ;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
hang.clear();
lie.clear();
for(int i = ;i <= k;++i)
{
scanf("%d%d%d",&mat[i].x,&mat[i].y,&mat[i].c);
hang[mat[i].x] = mat[i].x;
lie[mat[i].y] = mat[i].y;
}
sort(mat+,mat+k+,cmp);
printf("Case #%d:\n",kase++);
scanf("%d",&q);
int op,a,b;
while(q--)
{
scanf("%d%d%d",&op,&a,&b);
if(op == )
{
swap(hang[a],hang[b]);
}
else if(op == )
{
swap(lie[a],lie[b]);
}
else if(op == )
{
a = hang[a];
b = lie[b];
printf("%d\n",query(k,a,b));
}
}
}
return ;
}
/*
5
4 4 4dlsdfflsfls
1 1 1
2 4 4
3 2 2
4 4 3
*/

再附上一种短代码的完全用map实现的,其实关键就是用pair<int,int>作为键。

 #include<cstdio>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
int T,n,m,k,x,y,c,q,kase;
map<int,int> hang,lie;
map<pair<int,int>,int> mp;
int main()
{
scanf("%d",&T);
kase = ;
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
hang.clear(),lie.clear(),mp.clear();
while(k--)
{
scanf("%d%d%d",&x,&y,&c);
hang[x] = x,lie[y] = y;
mp[pair<int,int> (x,y)] = c;
}
printf("Case #%d:\n",kase++);
scanf("%d",&q);
while(q--)
{
scanf("%d%d%d",&c,&x,&y);
if(c == ) swap(hang[x],hang[y]);
else if(c == ) swap(lie[x],lie[y]);
else
{
x = hang[x],y = lie[y];
printf("%d\n",mp[pair<int,int> (x,y)]);
}
}
}
return ;
}

HDU 4941 Magical Forest(map映射+二分查找)杭电多校训练赛第七场1007的更多相关文章

  1. HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...

  2. HDU 4864 Task (贪心+STL多集(二分)+邻接表存储)(杭电多校训练赛第一场1004)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4864 解题报告:有n台机器用来完成m个任务,每个任务有一个难度值和一个需要完成的时间,每台机器有一个可 ...

  3. hdu 4941 Magical Forest

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

  4. hdu 4941 Magical Forest (map容器)

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

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

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

  6. 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 ...

  7. HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&#39;s problem(manacher+二分/枚举)

    pid=5371">HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分同样,第一部分与第二部分对称. 如今给你一个长为n(n<10^5)的序 ...

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

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

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

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

随机推荐

  1. ubuntu14.04安装GoldenDict

    1. 软件商店搜索goldendict安装或者$ sudo apt-get install goldendict 2. 配置网页翻译源 编辑-->词典--->网站选项卡,点击添加 以下是有 ...

  2. arcglobe 图层三大类说明

    若是第一次打开,且在网络连接通畅的情况下,你会发现目录中已有部分数据层,这些数据层是由ArcGIS Online的在线数据:Imagery图层即在线的影像数据.高程数据.地名数据.运输线数据. Arc ...

  3. Socket通信的理解

    1.Socket(套接字) 是支持TCP/IP通信的基本操作单元.包含通信的五种必须信息:通信使用的协议,本机IP和端口,远程IP和端口. 2. 1.TCP连接 手机能够使用联网功能是因为手机底层实现 ...

  4. 9月23日JavaScript作业----两个列表之间移动数据

    作业一:两个列表之间数据从一个列表移动到另一个列表 <div style="width:600px; height:500px; margin-top:20px"> & ...

  5. Java国际化程序

    根据不同的国家配置不同的资源文件(资源文件有时也称为属性文件,后缀为.properties),所有的资源文件以键值对的形式出现. Locale类 ResourceBundle类 //========= ...

  6. React入门简单实践

    参考文献: 1.React入门示例教程——阮一峰 2.React仅仅只是你的界限 React主要的优点就是增量更新(虚拟DOM)和组件化(状态机). <!DOCTYPE html> < ...

  7. codeforces 724B Batch Sort(暴力-列交换一次每行交换一次)

    题目链接:http://codeforces.com/problemset/problem/724/B 题目大意: 给出N*M矩阵,对于该矩阵有两种操作: (保证,每行输入的数是 1-m 之间的数且不 ...

  8. github打不开

    所用方法:修改host文件 一.键入网址:http://github.global.ssl.fastly.net.ipaddress.com/#ipinfo 拿到github.global.ssl.f ...

  9. 浅谈T-SQL中的特殊联结

    引言 上一篇博客我们介绍了交叉联接,内联接,外联接3种基本的联接操作.这一篇文章我们介绍一些特殊的联接操作. 组合联接 组合联接就是联接条件涉及到联接两边的多个列的查询.当需要根据主键-外键关系来联接 ...

  10. iwebshop二次开发

    1.iwebshop中写hello world ① 动作action方式 controllers目录下,然后创建text.php. <?php class Test extends IContr ...