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= ...
随机推荐
- sphinx使用随笔
为什么需要进行全文搜索呢? 一个表中有a.b.c多个字段.我们使用sql进行like搜索的时候,往往只能匹配某个字段.或者是这样的形式:a LIKE “%关键词%”or b LIKE “关键词” 这样 ...
- django使用笔记
django的具体使用可以看官方手册http://djangobook.py3k.cn,这里主要记录使用django中遇到的问题. 1.中文编码问题. 因为我们用到的东西基本上都有中文,在settin ...
- NEC的学习笔记
写过很多代码后,会有代码的规范有一些需求,会有想写出美观.规范.易懂的代码. 今天学习了NEC,全称Nice Easy CSS(http://nec.netease.com/),顾名思义,就是为了写简 ...
- JavaScript Array(数组)对象
一,定义数组 数组对象用来在单独的变量名中存储一系列的值. 创建 Array 对象的语法: new Array(); new Array(size); new Array(element0, elem ...
- RHEL7进程管理
进程概念 名称 说明 程序 一组指令的集合 进程 程序的执行就是进程也可以把进程看成一个独立的程序在内存中有其对应的代码空间和数据空间,一个进程所拥有的数据和代码只属于自己进程是资源分配的基本单位,也 ...
- SQL2012 提示评估已过期 解决方案- sql server问题
SQL2012 提示评估已过期 解决方案提示评估已过期的解决方法和 sql2008一样 第1步:进入SQL2012配置工具中的安装中心第2步:再进入维护界面,选择版本升级第3步:进入产品密钥,输入密钥 ...
- How to Build Office Developer Tools Projects with TFS Team Build 2012
Introduction Microsoft Visual Studio 2012 provides a new set of tools for developing apps for Office ...
- Creating a SharePoint BCS .NET Connectivity Assembly to Crawl RSS Data in Visual Studio 2010
from:http://blog.tallan.com/2012/07/18/creating-a-sharepoint-bcs-net-assembly-connector-to-crawl-rss ...
- 高性能JS笔记2——数据存取
数据存取性能而言: 字面量>本地变量>数组元素>对象成员 一.标识符解析的性能 标识符解析是有代价的,一个标识符的位置越深,它的读写速度也就越慢. 局部变量的读写速度是最快的,全局变 ...
- 【读书笔记】iOS-NSDate
+dateWithTimeIntervalSinceNow:接受一个NSTimeInterval参数,该参数是一个双精度值,表示以秒为单位的时间间隔.通过该参数可以指定时间偏移的方式:对于将来的时间, ...