UVa:11991 Easy Problem from Rujia Liu?

来源:互联网 发布:java设计模式 组合模式 编辑:程序博客网 时间:2024/05/21 06:46

这个题很容易想到的思路就是开一个大小为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 longusing 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;}


 

0 0
原创粉丝点击