STL 使用,,由于数据范围没有 超越极限数据 依旧可以用 vector 搞定;
#include<iostream> #include<stdio.h> #include<cstring> #include<algorithm> #include<cmath> #include<map> #include<utility> #include<vector> using namespace std; pair<int,vector<int> >b; map<int,vector<int> >a; vector<int>v[1000006]; int main( ) { int N,M; while( scanf("%d%d",&N,&M) != EOF ) { for( int i = 0; i < 1000006; i++ ) v[i].clear(); for( int i = 1; i <= N; i++ ) { int a; scanf("%d",&a); v[a].push_back( i ); } for( int i = 1; i <= M; i++ ) { int k,num; scanf("%d%d",&k,&num); if( v[num].size() && v[num].size() >= k )cout<<v[num][k-1]<<endl; else puts("0"); } } return 0; }
但数据范围变大的时候, 单单 一个 vector 就搞不定了; 需要 map 一起使用;
#include<iostream> #include<stdio.h> #include<cstring> #include<algorithm> #include<cmath> #include<map> #include<utility> #include<vector> using namespace std; pair<int,vector<int> >b; map<int,vector<int> >a; vector<int>v[1000006]; int main( ) { int N,M; while( scanf("%d%d",&N,&M) != EOF ) { a.clear(); for( int i = 1; i <= N; i++ ) { int c; scanf("%d",&c); if( a.find(c) == a.end() )a[c] = vector<int>(); a[c].push_back( i ); } for( int i = 1; i <= M; i++ ) { int k,num; scanf("%d%d",&k,&num); if( a.find(num) == a.end() || a[num].size() < k )puts("0"); else printf("%d ",a[num][k-1]); } } return 0; }