HDU 4941 Magical Forest --STL Map应用
题意: 有n*m个格子(n,m <= 2*10^9),有k(k<=10^5)个格子中有值,现在有三种操作,第一种为交换两行,第二种为交换两列,交换时只有两行或两列都有格子有值或都没有格子有值时才能交换,第三种操作是询问现在第A行第B列值为多少.
解法:格子太大,但是k比较小,所以考虑离散一下,把行离散出来,最多10^5行,列用map存下即可。
nowR[i] = j 时表示现在的第 i 行是原来的第 j 行, nowC表示列的
R[]表示该行有没有值, CntC[]表示列
然后交换时直交换上面几个东西即可。
查询时先找到nowR[mp[A]], nowC[B],在对应原来的那一行里面找B即可,普通找不好找,索性预先把每行有的元素存起来,存到一个vector V[10^5]里面,因为要存下,所以行需要离散,然后排个序,以后就可以二分地找了。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
#define N 100007 int nowR[N],R[N],b[N];
map<int,int> mp,CntC,nowC;
vector<pair<int,int> > V[N];
struct Point
{
int x,y,c;
}p[N]; int bsearch(int i,int low,int high,int x)
{
while(low <= high)
{
int mid = (low+high)/;
if(V[i][mid].first == x)
return mid;
else if(V[i][mid].first > x)
high = mid-;
else
low = mid+;
}
return low;
} int main()
{
int n,m,k,i,j,T;
int t,cs = ;
int op,A,B;
scanf("%d",&t);
while(t--)
{
mp.clear(); nowC.clear(); CntC.clear();
scanf("%d%d%d",&n,&m,&k);
for(i=;i<=k;i++)
{
V[i].clear();
scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].c);
p[i].x++, p[i].y++;
nowC[p[i].y] = p[i].y;
b[i] = p[i].x;
}
sort(b+,b+k+);
int ind = unique(b+,b+k+)-b-;
for(i=;i<=ind;i++)
mp[b[i]] = i;
memset(R,,sizeof(R));
for(i=;i<=k;i++)
{
int toR = mp[p[i].x];
R[toR]++;
int toC = nowC[p[i].y];
CntC[toC]++;
V[toR].push_back(make_pair(p[i].y,p[i].c));
}
for(i=;i<=ind;i++)
{
nowR[i] = i;
sort(V[i].begin(),V[i].end());
}
scanf("%d",&T);
printf("Case #%d:\n",cs++);
while(T--)
{
scanf("%d%d%d",&op,&A,&B);
A++,B++;
if(op == )
{
int toA = mp[A];
int toB = mp[B];
if((R[toA]&&R[toB]) || (!R[toA]&&!R[toB]))
{
swap(nowR[toA],nowR[toB]);
swap(R[toA],R[toB]);
}
}
else if(op == )
{
if((CntC[A]&&CntC[B])||(!CntC[A]&&!CntC[B]))
{
swap(CntC[A],CntC[B]);
swap(nowC[A],nowC[B]);
}
}
else
{
int nA = nowR[mp[A]];
int nB = nowC[B];
int id = bsearch(nA,,V[nA].size()-,nB);
if(id < || id >= V[nA].size() || V[nA][id].first != nB)
puts("");
else
printf("%d\n",V[nA][id].second);
}
}
}
return ;
}
HDU 4941 Magical Forest --STL Map应用的更多相关文章
- 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 )
题目链接 题意: 有一个n*m的田地,里边有k棵树,每棵树的位置为(xi,yi),含有能量值ci.之后又q个询问,分三种; 1)1 a b,将a行和b行交换 2)2 a b,将a列和b列交换 3)3 ...
- 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】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941 题目大意:给你10^5个点.每一个点有一个数值.点的xy坐标是0~10^9.点存在于矩阵中.然后 ...
- HDU 4941 Magical Forest (Hash)
这个题比赛的时候是乱搞的,比赛结束之后学长说是映射+hash才恍然大悟.因此决定好好学一下hash. 题意: M*N的格子,里面有一些格子里面有一个值. 有三种操作: 1.交换两行的值. 2.交换两列 ...
- HDU 4941 Magical Forest(2014 Multi-University Training Contest 7)
思路:将行列离散化,那么就可以用vector 存下10W个点 ,对于交换操作 只需要将行列独立分开标记就行 . r[i] 表示第 i 行存的是 原先的哪行 c[j] 表示 第 j ...
- HDU 4585 Shaolin(STL map)
Shaolin Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit cid= ...
随机推荐
- Android小项目合集(经典教程)包含十五个Android开发应用实例
http://www.cnblogs.com/aimeng/archive/2012/03/28/2422435.html
- log4j.xml 配置参数属性level使用心得
jdbc.sqlonly 只显示执行的sql语句.info级才可以显示,debug增加显示java源代码位置. jdbc.sqltiming 显示执行的sql语句以及语句执行时间, ...
- windbg定位死锁
操作系统对死锁的描述如下: 所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 那么为什么会产生死锁呢? 1.因为系统资源不足. ...
- SQL数据库基础(四)
聚合函数:sum,avg,max,min,count 使用方法示例: group by 分组的使用方法 分组的练习: 数学函数:ABS.ceiling.floor.power.round.sqrt. ...
- jquery 监控文本框键盘事件(回车事件),附常用keycode值。
$(function(){ $(".search").keydown(function(event) { ) { //执行操作 } }) ); 完整的 key press 过程分为 ...
- Office版本问题0x80029C4A
说来奇怪,以前运行正常的程序(涉及excel表格输出),现在运行失败了,一调试,发现了如下问题: 无法将类型为"Microsoft.Office.Interop.Excel.Applicat ...
- 新著作计划:《水利水电工程施工导流 水力计算与.NET编程》
目 录 第一篇 基础理论篇 第1章 施工导截流设计概述 第2章 基本水力计算 2.1 临界水深计算 2.2 正常水深计算 2.3 堰流水力计算 2.4 明渠流水力计算 2.5 管流水力计算 第3章 ...
- Interoperability between Java and SharePoint 2013 on Premises
http://ctp-ms.blogspot.com/2012/12/interoperability-between-java-and.html Introduction One of the ...
- 深入理解Activity -动手写实例来感受Activity的启动模式
介绍 上篇提到了Activity的任务,任务栈,以及启动模式.对这些概念有了了解以后,自己写一下例子来感受一下,就当作复习和加深印象了.如果对概念不熟悉的可以参考:深入理解Activity-任务,回退 ...
- HashMap,HashTable,TreeMap区别和用法
开始学HashTable,HashMap和TreeMap的时候比较晕,觉得作用差不多,但是到实际运用的时候又发现有许多差别的.需要大家注意,在实际开发中以需求而定. java为数据结构中的映射定义了一 ...