首页 > 其他 > 详细

Easy Problem-map和vector的使用

时间:2014-03-05 04:20:56      阅读:450      评论:0      收藏:0      [点我收藏+]

  给出一个包含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>。

  代码如下:

bubuko.com,布布扣
#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\n");
            else
                printf("%d\n",data[v][k-1]);
        }
    }
    system("pause");
    return 0;  
}
bubuko.com,布布扣

Easy Problem-map和vector的使用,布布扣,bubuko.com

Easy Problem-map和vector的使用

原文:http://www.cnblogs.com/chenbjin/p/3580410.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!