UVa 11991 - Easy Problem from Rujia Liu?

题意

刘汝佳出的一道简单题? 一看出题人就知道肯定不简单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\n",m[b][a-1]);
        }
    }
    return 0;
}
posted @ 2018-02-02 21:49  JinxiSui  阅读(107)  评论(0编辑  收藏  举报