标签:
题目大意:
求第k个v出现的索引
解题思路:
如果能构造出一个数据结构,使得data[v][k]就是第k个v出现的索引值即可求解。data[v]表示数v出现的索引数组,
data[v][k]表示第k个v出现的索引。
Though Rujia Liu usually sets hard problems for contests (for example, regional contests like Xi‘an 2006, Beijing 2007 and Wuhan 2009, or UVa OJ contests like Rujia Liu‘s Presents 1 and 2), he occasionally sets easy problem (for example, ‘the Coco-Cola Store‘ in UVa OJ), to encourage more people to solve his problems :D
Given an array, your task is to find the k-th occurrence (from left to right) of an integer v. To make the problem more difficult (and interesting!), you‘ll have to answer m such queries.
There are several test cases. The first line of each test case contains two integers n, m(1<=n,m<=100,000), the number of elements in the array, and the number of queries. The next line contains n positive integers not larger than 1,000,000. Each of the following m lines contains two integer k and v (1<=k<=n, 1<=v<=1,000,000). The input is terminated by end-of-file (EOF). The size of input file does not exceed 5MB.
For each query, print the 1-based location of the occurrence. If there is no such element, output 0 instead.
8 4 1 3 2 2 4 3 2 1 1 3 2 4 3 2 4 2
2 0 7 0
代码如下:
/* * UVA_11991.cpp * * Created on: 2014年12月28日 * Author: Administrator */ #include <iostream> #include <cstdio> #include <map> #include <vector> using namespace std; map<int ,vector<int> > mp; int n,m; int main(){ while(scanf("%d%d",&n,&m)!=EOF){ mp.clear(); int i; for(i = 0 ; i < n ; ++i){ int tmp; scanf("%d",&tmp); /** * 返回map中键k的出现次数(对于map而言,由于一个key对应一个value, * 因此返回只有0和1,因此可以用此函数判断k是否在map中) */ if(mp.count(tmp) == 0){//如果这个key值没有出现过 mp[tmp] = vector<int> ();//那么创建一个新的vector。在这里要注意vector()的实例化 } mp[tmp].push_back(i+1); } while(m--){ int k,v; scanf("%d%d",&k,&v); if(mp.count(v) == 0 || mp[v].size() < k){//如果这个值不存在,或者是需要访问的位置超过了这个只出现的次数 printf("0\n");//打印1 }else{ printf("%d\n",mp[v][k-1]); } } } return 0; }
(DS 《算法入门经典》)UVA 11991 Easy Problem from Rujia Liu?(求第k个v出现的索引)
标签:
原文地址:http://blog.csdn.net/hjd_love_zzt/article/details/42218653