题意
刘汝佳出的一道简单题? 一看出题人就知道肯定不简单233
大概是就是输入一个数组 然后找几个下标
比如4 2就是找到数组中第4个2所在下标, 找不到输出0
思路
蓝书上给的思路是真的很巧妙, 复杂度很小(题目时间1000ms)
把输入组织成一个可以”直接读取结果”的数据结构
构造一个 map< int,vector< int> >
从查询的角度来看,把输入组织成一个可以“只读结果”的数据结构,例如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>
AC代码
#include <cstdio>
#include <map>
#include <vector>
using namespace std;
typedef vector<int> vec;
map<int,vec> m;
int main()
{
int T, n, i, x;
int a, b;
while( ~scanf("%d%d",&T,&n) ){
if( !m.empty() ) m.clear();
for( i = 1; i <= T; i++ ){
scanf("%d",&x);
if( !m.count(x) )
m[x] = vector<int>();
m[x].push_back(i);
}
while(n--){
scanf("%d%d",&a,&b);
if( !m.count(b) || m[b].size() < a )
puts("0");
else
printf("%d
",m[b][a-1]);
}
}
return 0;
}