UVA 11991 - Easy Problem from Rujia Liu?(STL)

题目链接 https://cn.vjudge.net/problem/UVA-11991

【题意】
给出一个长度为n的整形数组,m次查询(1<=n,m<=1e6),每次询问两个整数k,v(1<=k<=n, 1<=v<=1e6)输出从左到右第k个v的下标(从1~n),元素不存在则输出0

【思路】
用vector和map结合去存储数据就可以做到O(1)的查询了

#include<bits/stdc++.h>
using namespace std;

int n,m;
map<int,vector<int> > a;

int main(){
    while(scanf("%d%d",&n,&m)==2){
        a.clear();
        for(int i=0;i<n;++i){
            int x;
            scanf("%d",&x);
            if(a[x].empty()) a[x]=vector<int>();
            a[x].push_back(i+1);
        }
        while(m--){
            int k,v;
            scanf("%d%d",&k,&v);
            if(a[v].size()>=k) printf("%d\n",a[v][k-1]);
            else puts("0");
        }
    }
    return 0;
}
posted @ 2018-08-15 22:48  不想吃WA的咸鱼  阅读(89)  评论(0编辑  收藏  举报