map
map<typename1,typename2>name
map翻译为映射,数组属于一种映射,总是将int类型映射到其他基本类型。而map可以将任何基本类型映射到任何基本类型。
map经常用于下列情况:
1.需要建立字符(串)与整数之间的映射;
2.判断大整数或者其他类型数据是否存在,桶排序;
3.字符串与字符串之间的映射。
pair
pair<typename1,typename2>name
pair是二元结构体的替代品,且按first自动从小到大排序。
1687保龄球map
#include <bits/stdc++.h>
using namespace std;
map<int,int>vis;
int main()
{
int m,n,x,y,i;
//ios::sync_with_stdio(false);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
vis[x]=i;
}
scanf("%d",&m);
while(m--)
{
scanf("%d",&y);
if(vis[y])
printf("%d\n",vis[y]);
else printf("0\n");
}
return 0;
}
1678查字典
#include <bits/stdc++.h>
using namespace std;
map<string,int>vis;
int main()
{
int m,n,y;
string x,xx;
//ios::sync_with_stdio(false);
scanf("%d",&n);
while(n--)
{
cin>>x;
scanf("%d",&y);
vis[x]=y;
}
scanf("%d",&m);
while(m--)
{
cin>>xx;
printf("%d\n",vis[xx]);
}
return 0;
}
1686
#include <bits/stdc++.h>
using namespace std;
map<int,int>vis;
int m,n,i,ans=0;
int x[100001],y;
int main()
{
scanf("%d%d",&m,&n);
for(i=1;i<=m;i++)
{
scanf("%d",&x[i]);
vis[x[i]]++;
}
while(n--)
{
scanf("%d",&y);
vis[y]++;
}
for(i=1;i<=m;i++)
{
if(vis[x[i]]==2)
{
printf("%d ",x[i]);
}
}
return 0;
}
1677(难)
#include <bits/stdc++.h>
using namespace std;
set<int>ans;
map<int,int>vis;
int m,x,s,i;
int mx;
int main()
{
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%d",&x);
vis[x]++;
ans.insert(x);
mx=max(mx,x);
}
for(set<int>::iterator it=ans.begin();it!=ans.end();it++)
{
x=*it;
int tmp=vis[x];
vis[x]=tmp%2;
if(vis[x]==0)
s++;
int k=tmp/2;
if(!vis[x+1]&&k!=0)
{
ans.insert(x+1);
mx=max(mx,x+1);
}
vis[x+1]+=k;
}
printf("%d\n",mx+1-ans.size()+s);
return 0;
}