Features Track[STL map]
题目地址
Features Track(ACM-ICPC 2018 徐州赛区网络预赛 )
题干
代码和解释
题意:一个动画有许多 n 帧,每帧有 k 个点,点的坐标 (x,y) 相同则视作同一个点。先要求找出在相邻帧存在的点最多的帧数是多少。比如:点 (1,4) 在第2、3、4、7、8帧存在,则其连续存在于 2-3-4 和 7-8 帧处,其连续存在的最多帧为3帧。
输入:T(样例组数),n(帧数),每帧输入k(此帧点数),其后跟着 2k 个整数表示 k 的点的 x 和 y 坐标。
如果对于每一帧的每一个点存起来后依次查找其位置,则时间复杂度过高。而 STL map 使用哈希,搜索快。并且使用01滚动的方式,只需要两帧、两个map(上一个和这一个),而不需要 n 个map就可以解决此题。
下面是本题的c++代码
#include<bits/stdc++.h>
using namespace std;
//只需要看这一位和上一位即可,来回01滚动
map< int,map<pair<int,int>,int> > mp;//外层的key是0或1,内层的key是点的值,内层的value是连续出现几次
pair<int,int> p;//点p坐标x和y
int main()
{
int T;
int n;
int k;
int x,y;
int ans;
int magic;//tql,magic只为0或1,异或计算
scanf("%d",&T);//样例组数
while(T--){
scanf("%d",&n);//几帧动画
magic = 0;//对于一个样例,初始化
ans = 0;
while(n--){
scanf("%d",&k);//这一帧有几个点
mp[magic].clear();//每帧一次,将旧的清0,当成新的
while(k--){
scanf("%d%d",&x,&y);
p=make_pair(x,y);//制造点
//1.如果magic=0,则magic^1=1。如果mp[1].count(p)不为0(则为1),说明在上一帧有p点
//2.如果magic=1,则magic^1=0。如果mp[0].count(p)不为0(则为1),说明在上一帧有p点
//3.如果magic=0,则magic^1=1。如果mp[1].count(p)为0,说明在上一行没有p点,而在这一帧出现了p点
//4.如果magic=1,则magic^1=0。如果mp[0].count(p)为0,说明在上一行没有p点,而在这一帧出现了p点
mp[magic][p]=mp[magic^1][p]+1;//更新p点的连续出现次数,比上次多1(上次可能是0,也可能不是0)
ans=max(ans,mp[magic][p]);//更新最大连续出现次数
//如果p点在这一帧没有出现,则对于这个p,不会走上面的这两帧。因为之前经过了每帧的 mp[magic].clear(),全部清0,所以下一次循环时,mp[magic^1][p]会为0,说明p点在这一帧没有出现。
}
magic^=1;//每帧一次。如果magic是1,则变为0;如果magic是0,则变为1。然后 mp[magic].clear(),清掉旧的,保留这次循环里留下的新的
}
printf("%d\n",ans);
}
return 0;
}
异或的特殊用法:偶数异或1会得到它加1,奇数异或1会得到它减1。所以使用异或1可以使0和1相互转化。
参考
ACM-ICPC2018徐州网络赛 Features Track(二维map+01滚动)
记异或的妙处(异或1)
- map:关联容器,实现从键(key)到值(value)的映射。
- map效率高的原因:用平衡二叉搜索树来存储和访问。
查找的复杂度是O(logn)。
例子 | 说明 |
---|---|
map<Type1,Type2> A; | 定义,key的类型是Type1,value的类型是Type2 |
A[x] | 返回key x到value的引用,时间复杂度为O(logn),可以用于赋值。若x不存在,则自动新建一个二元组(x,zero),并返回zero的引用 |
A.size() | 返回元素个数,时间复杂度O(1) |
A.empty() | 判断是否为空 |
A.clear() | 清空A |
A.count(x) | 返回A中key为x的元素个数,时间复杂度为O(logn),因为map中一个key只对应一个value,所以A.count(x)只可能为0或1 |
map<Type1,Type2>::iterator it | 定义迭代器it |
it->first | 返回迭代器对应的key |
it->second | 返回迭代器对应的value |
A.find(x) | 在A中查找key为x的二元组,并返回指向该二元组的迭代器,若不存在,返回map.end(),时间复杂度为O(logn) |
A.insert(pair<Type1,Type2>(x,v)) | 返回插入地址的迭代器和是否插入成功的bool并成的pair,时间复杂度为O(logn) |
A.erase(参数) | 删除,参数可以是pair或者迭代器,返回下一个元素的迭代器,时间复杂度为O(logn) |
Features Track[STL map]的更多相关文章
- 计蒜客 31458.Features Track-滚动数组+STL(map)连续计数 (ACM-ICPC 2018 徐州赛区网络预赛 F)
F. Features Track Morgana is learning computer vision, and he likes cats, too. One day he wants to f ...
- ACM-ICPC2018徐州网络赛 Features Track(二维map+01滚动)
Features Track 31.32% 1000ms 262144K Morgana is learning computer vision, and he likes cats, too. ...
- stl::map之const函数访问
如何在const成员数中访问stl::map呢?例如如下代码: string ConfigFileManager::MapQueryItem(const string& name) const ...
- hdu4941 Magical Forest (stl map)
2014多校7最水的题 Magical Forest Magical Forest Time Limit: 24000/12000 MS (Java/Others) Memory Limit ...
- [CareerCup] 13.2 Compare Hash Table and STL Map 比较哈希表和Map
13.2 Compare and contrast a hash table and an STL map. How is a hash table implemented? If the numbe ...
- STL MAP及字典树在关键字统计中的性能分析
转载请注明出处:http://blog.csdn.net/mxway/article/details/21321541 在搜索引擎在通常会对关键字出现的次数进行统计,这篇文章分析下使用C++ STL中 ...
- POJ 3096 Surprising Strings(STL map string set vector)
题目:http://poj.org/problem?id=3096 题意:给定一个字符串S,从中找出所有有两个字符组成的子串,每当组成子串的字符之间隔着n字符时,如果没有相同的子串出现,则输出 &qu ...
- STL MAP 反序迭代
ITS_NOTICE_MAP::reverse_iterator it = noticeMap.rbegin(); for ( ; it != noticeMap.rend(); ++it ) { I ...
- 泛型Binary Search Tree实现,And和STL map比较的经营业绩
问题叙述性说明: 1.binary search tree它是一种二进制树的.对于key值.比当前节点左孩子少大于右子. 2.binary search tree不是自平衡树.所以,当插入数据不是非常 ...
随机推荐
- zynq开发板外设配置演示
有幸得到米尔电子zynq系列开发板Z-turn Board试用体验,下面说说我这款zynq系列的Z-TURN板子外设配置.从Z-turn Board原理图上看,目前可以配置的FPGA管脚大概有100多 ...
- 使用DES算法实现加密解密
使用DES算法实现加密解密 我们常见的加密算法有DES.MD5.IDEA.AES等等,这篇随笔介绍使用DES算法实现加密解密 首先介绍一下DES算法: DES算法为密码体制中的对称密码体制,又被称为美 ...
- iframe中操作主体页面的元素,方法
在不使用三大框架的情况下,iframe的使用可以做到在页面中直接引入别的页面作为当前页面的一部分,但是在iframe的使用过程中存在一些相互之间的操作 例如在iframe中获取主页面的元素,使用主页面 ...
- Eclipse apk项目创建和项目构架
一.创建项目工程 设定名字 设定包名(每一台机器只有唯一的包名)下一步 根据设置进行选择 创建空项目 Finish即可创建 调节项目的字体 二.Eclipse 项目构架 Src 2. Gen R.ja ...
- PHP应用如何对接微信公众号JSAPI支付
微信支付的产品有很多,1. JSAPI支付 2. APP支付 3. Native支付 4.付款码支付 5. H5支付. 其中基于微信公众号开发的应用选择“JSAPI支付“产品,其他APP支付需 ...
- memcpy函数的实现
1.按1个字节拷贝 (1)不要直接使用形参,要转换成char* (2)目标地址要实现保存 (3)要考虑源和目标内存重叠的情况 void * mymemcpy(void *dest, const voi ...
- pandas 之 group by 过程
import numpy as np import pandas as pd Categorizing a dataset and applying a function to each group ...
- Django简介,请求生命周期,静态文件配置
Web框架 Web框架(Web framework)是一种开发框架,用来支持动态网站.网络应用和网络服务的开发.这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方 ...
- Spring Cloud 手记
文档:https://www.springcloud.cc/spring-cloud-dalston.html#_features 一年了,我们都用 Spring Cloud 干了啥?:https:/ ...
- PAT 乙级 1040.有几个PAT C++/Java
题目来源 字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T):第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位( ...