• UVa 11991:Easy Problem from Rujia Liu?(STL练习,map+vector)


    Easy Problem from Rujia Liu?

    Though Rujia Liu usually sets hard problems for contests (for example, regional contests like Xi'an 2006, Beijing 2007 and Wuhan 2009, or UVa OJ contests like Rujia Liu's Presents 1 and 2), he occasionally sets easy problem (for example, 'the Coco-Cola Store' in UVa OJ), to encourage more people to solve his problems :D

    Given an array, your task is to find the k-th occurrence (from left to right) of an integer v. To make the problem more difficult (and interesting!), you'll have to answer m such queries.

    Input

    There are several test cases. The first line of each test case contains two integers n, m(1<=n,m<=100,000), the number of elements in the array, and the number of queries. The next line contains n positive integers not larger than 1,000,000. Each of the following m lines contains two integer k and v (1<=k<=n, 1<=v<=1,000,000). The input is terminated by end-of-file (EOF). The size of input file does not exceed 5MB.

    Output

    For each query, print the 1-based location of the occurrence. If there is no such element, output 0 instead.

    Sample Input

    8 4
    1 3 2 2 4 3 2 1
    1 3
    2 4
    3 2
    4 2
    

    Output for the Sample Input

    2
    0
    7
    0
    

    Rujia Liu's Present 3: A Data Structure Contest Celebrating the 100th Anniversary of Tsinghua University
    Special Thanks: Yiming Li
    Note: Please make sure to test your program with the gift I/O files before submitting!


      STL练习,map+vector。

      题意是“给出一个包含n个整数的数组,你需要回答若干次询问。每次询问两个整数k和v,输出从左到右第k个v的下标(数组下标从左到右编号为1~n)”

      很显然,这是一个二维的结构,我们用下标代表要查询的数v,a[v][k]就代表第k次出现v的下标值。首先我们会想到开一个二维数组,但是这样空间消耗太大。不如利用C++STL库提供的数据结构来存储,在这里我们可以用 map+vector,申请的变量为为map <int,vector<int> > a。它的好处是存储空间是动态改变的,不用一开始就创建很大的数组来存储。

      代码

     1 #pragma warning (disable:4786)
     2 #include <stdio.h>
     3 #include <map>
     4 #include <vector>
     5 using namespace std;
     6 int main()
     7 {
     8     int i,n,m,x,k,v;
     9     while(scanf("%d%d",&n,&m)!=EOF){
    10         map <int,vector<int> > a;
    11         for(i=0;i<n;i++){    //预处理
    12             scanf("%d",&x);
    13             if(!a.count(x))    //x一次没有出现过
    14                 a[x] = vector<int>();
    15             a[x].push_back(i+1);    //从0开始push
    16         }
    17         //查询
    18         for(i=0;i<m;i++){
    19             scanf("%d%d",&k,&v);
    20             if(a.size()<v && a[v].size()<k)
    21                 printf("0
    ");
    22             else
    23                 printf("%d
    ",a[v][k-1]);    //因为是从0开始push,所以k-1
    24         }
    25     }
    26     return 0;
    27 }

    Freecode : www.cnblogs.com/yym2013

  • 相关阅读:
    Python3安装和虚拟环境配置
    CentOS中nginx安装部署
    CRM项目的整理---第一篇
    软件代码的发布
    ansible的roles使用
    ansible中的playbook脚本的介绍与使用
    ansible模块的介绍与使用
    Ansible的参数介绍
    ansible的介绍与安装
    linux网络配置,查看IP地址
  • 原文地址:https://www.cnblogs.com/yym2013/p/3696956.html
Copyright © 2020-2023  润新知