UVa:11991 Easy Problem from Rujia Liu?

这个题很容易想到的思路就是开一个大小为n的vector数组,每个数组下标表示数值大小,然后存每个数字的下标。这样构造是O(n),查询是O(1),但有一个缺点就是只能适用于数值比较小的情况。如果数值比较大,数组就开不下了。

LRJ的思路是用map<int,vector<int> > 实现的。这样构造是O(nlogn),查询是O(logn),但是可以接受数值比较大的情况,而且初始化很好写。

总之这里开的数组一定是要变长的,比如说vector。如果用定长的会有很大空间浪费。

 

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
#include <stack>
#include <algorithm>
#define MAXN 1000000
#define MOD 1000000007
#define INF 2139062143
#define ll long long
using namespace std;
map<int,vector<int> > mp;
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        mp.clear();
        for(int i=1; i<=n; ++i)
        {
            int t;
            scanf("%d",&t);
            mp[t].push_back(i);
        }
        while(m--)
        {
            int k,v;
            scanf("%d%d",&k,&v);
            k--;
            if(mp[v].empty()||k>=mp[v].size()) printf("0\n");
            else printf("%d\n",mp[v][k]);
        }
    }
    return 0;
}


 

你可能感兴趣的:(数据结构)