Easy Problem from Rujia Liu?(UVa 11991) map应用

来源:互联网 发布:arm linux nohup 编辑:程序博客网 时间:2024/05/22 11:57

来自《算法竞赛入门经典训练指南》

1.题目原文

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3142
给出一个n个整数的数组,有m个查询,每次查询两个整数k和v,输出从左到右第k个v的下标(数组的下标从1到n),不存在输出0

2.解题思路

可以利用map,每个值v映射一个下标k,即data[v]。而题目要求的是可能有多个k,因此data[v]应该是一个数组,显然数组大小未定,用不定长数组vector很容易解决。
时间复杂度为O(nlogn)

3.AC代码

#include <algorithm>#include <cctype>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iomanip>#include <iostream>#include <map>#include <queue>#include <string>#include <set>#include <vector>#include<cmath>#include<bitset>#include<sstream>using namespace std;#define INF 0x7fffffff#define maxn 10005map<int,vector<int> >a;int main(){    int n,m,k,v;    while(scanf("%d%d",&n,&m)==2){        for(int i=0;i<n;i++){            int x;            scanf("%d",&x);            if(!a.count(x)){                a[x]=vector<int>();            }            a[x].push_back(i+1);        }        while(m--){            scanf("%d%d",&k,&v);            if(!a.count(v)||a[v].size()<k){                printf("0\n");            }            else printf("%d\n",a[v][k-1]);        }    }    return 0;}


0 0