Easy Problem-map和vector的使用

  给出一个包含n个整数的数组,你需要回答若干询问。每次询问包含两个整数k和v,输出从左到右第k个v的下标(数组下标,从左右到右编号1~n)。

【输入格式】

  输入包含多组数据。每组数据第一行为两个整数n和m(1<= n,m <=100000),第二行包含n个不超过10^6的正整数,即待查询的数组。以下m行每行包含两个整数k和v(1<=k<=n,1<=v<=10^6)。输入结束标识为EOF。

【输出格式】

  对于每个查询,输出查询结果。如果不存在,输出0.

【分析】

  从查询的角度来看,把输入组织成一个可以“只读结果"的数据结构,例如data[v][k]就是答案。但由于v的范围比较大,这里的data不应是一个数组,而是一个STL的map,也就是说data[v]指map中键v对应的”值“,由于我们要以data[v][k]访问,那么data[v]的”值“应该是一个数组,保存整数v从左到右依次出现的下标(因此第k次出现的下标就是data[v][k])。

  另外,不同整数出现的次数可能相差很大,data[v]应是一个变长数组,如vector<int>。

  代码如下:

#include <cstdio>
#include <iostream>
#include <vector>
#include <map>
using namespace std;
map<int,vector<int> > data;

int main()
{
    int n,m,v,k;
    while(scanf("%d%d",&n,&m) == 2)
    {
        data.clear();
        for(int i = 0; i < n; i++)
        {
            scanf("%d",&v);
            if(!data.count(v)) data[v] = vector<int>();
            data[v].push_back(i+1);
        }
        while(m--)
        {
            scanf("%d%d",&k,&v);
            if(!data.count(v) || data[v].size() < k)
                printf("0
");
            else
                printf("%d
",data[v][k-1]);
        }
    }
    system("pause");
    return 0;  
}
原文地址:https://www.cnblogs.com/chenbjin/p/3580410.html