map
在数据特别庞大,数组已经满足不了的某些情况下codevs p1230,可以用上map;
我们可以将map容器作为一个有序的映射表,看作为一个下表可以是任意类型的数组;
map是一个红黑树,单次操作的时间o(lgn);
使用
- 定义map
map<类型1,类型2>变量名
map<string,int>ma //定义ma
ma["abc"]=2 //将"abc"映射在2上
cout<<ma["abc"]<<endl; //输出2
- 操作
operator[] | 访问map中的元素,若该元素不存在,将创建一个新元素,并将该元素映射到类型2的初始值上 |
ma.begin() | 返回map中第一个元素的迭代器(指针) |
ma.end() | 返回map中最后一个元素的迭代器(指针) |
ma.size() | 返回map中元素个数 |
ma.cout(element) | 若map中存在element,返回1,否则返回0 |
ma.clear() | 初始化map |
ma.lower_bound() | 返回大于等于给定元素的第一个位置 |
模板题
题目描述
给出n个正整数,然后有m个询问,每个询问一个整数,询问该整数是否在n个正整数中出现过。
输入输出
input
第一行两个整数 n 和m。
第二行n个正整数(1<=n<= 100000)
第三行m个整数(1<=m<=100000)
output
一共m行,若出现则输出YES,否则输出NO
样例
输入
4 2 2 1 3 4 1 9
输出
YES
NO
数据范围
不超过10^8
代码
#include<cstdio> #include<map> using namespace std; map<int,int> ma; int n,m; int main() { scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) { int w; //读入与编号 scanf("%d",&w); ma[w]=i; } for(int i=1; i<=m; i++) { int w; scanf("%d",&w); if(ma.count(w)) printf("%s ","YES"); else printf("%s ","NO");//寻找当中是否有这个数 } }