uva 11991 (map vector 嵌套)

其实这题可以直接用vector

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
vector<int> str[1000000+100];
int main()
{
    int n,m;
    int i,j,k;
    int que,num,temp;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(str,0,sizeof(str));
        for(i=1;i<=n;i++)
        {
            scanf("%d",&temp);
            str[temp].push_back(i);
        }
        for(i=1;i<=m;i++)
        {
            scanf("%d%d",&que,&num);
            if(str[num].size()>=que)
            printf("%d\n",str[num][que-1]);
            else printf("0\n");
        }
    }
    return 0;
}

大白上的代码

#include<cstdio>
#include<vector>
#include<map>
using namespace std;
map<int ,vector<int> > a;
int main()
{
    int n,m,x,y;
    while(scanf("%d%d",&n,&m)==2)
    {
        a.clear();
        for(int i=0;i<n;i++)
        {
            scanf("%d",&x);
            if(!a.count(x)) a[x]=vector <int>();
            a[x].push_back(i+1);
        }
        while(m--)
        {
            scanf("%d%d",&x,&y);
            if(!a.count(y)||a[y].size()<x) printf("0\n");
            else printf("%d\n",a[y][x-1]);
        }
    }
    return 0;
}
时间: 2024-10-28 11:02:43

uva 11991 (map vector 嵌套)的相关文章

UVa 12096 map ,vector,set,string ,stack的混用

背景:这个题对stl不熟悉根本无法自己作,只有照着理解书上的代码. 思路:用一个vector容器来储存集合,map中key为集合,value为该集合对应的vector容器的下标,并把下标称为ID,stack中储存的是ID每次对stack执行操作,实际是对stack中ID对应的集合执行操作用到了set_uinon和set_intersection. #include<iostream> #include<vector> #include<map> #include<

【PAT甲级】1039 Course List for Student (25 分)(vector嵌套于map,段错误原因未知)

题意: 输入两个正整数N和K(N<=40000,K<=2500),分别为学生和课程的数量.接下来输入K门课的信息,先输入每门课的ID再输入有多少学生选了这门课,接下来输入学生们的ID.最后N次询问,输入学生的ID输出该学生选了多少们课,输出所选课程的数量,按照递增序输出课程的ID. trick: 第5个数据点出现段错误,把原本以map存学生对应ID再映射vector存储该学生所选课程改成vector嵌套在map内,就没有段错误的问题出现,疑似映射过程中指针漂移??? 代码: #define H

uva 11991 Easy Problem from Rujia Liu? Data Structure

// uva 11991 Easy Problem from Rujia Liu? // 给一个包含n个数的数组,需要回答若干个询问,每次询问两个整数 // k和v,输出从左到右第k个v的下标 // // 本题因为n比较大,所以直接开二维数组是不现实的 // 如果直接用vector的话,也是会有大量的浪费 // 所以可以先离散化一下,找到一共有多少个不同的数 // 再用vector动态数组就可以搞定了 // // 看着书上的map写的挺精彩的,我就习用了下来 // // 非常精彩,继续练吧...

uva 11991 - Easy Problem from Rujia Liu?(STL)

题目链接:uva 11991 - Easy Problem from Rujia Liu? 题目大意:给出一个包含n个整数的数组,你需要回答若干询问,每次询问两个整数k和v,输出从左到右第k个v的下标 解题思路:用map映射一个vector,对应即为map<int>即为一个可变长的数组,读取数组的时候将对应值放入即可. #include <cstdio> #include <cstring> #include <map> #include <vecto

[UVA 12589]Learning Vector[DP]

题目链接:[UVA 12589]Learning Vector[DP] 题意分析:给出n个矢量,从中选择k个,以坐标原点为起点,收尾相连,问:这样的k个周围相连矢量与x轴围成图形的最大面积的两倍是多少? 解题思路:考虑状态:dp[id][pick][h]代表到第id个矢量为止,选择pick个矢量离最大面积还差多少,h为当前图形最右端高度.具体转移看代码. 这里着重说一下为什么要对这些矢量按斜率进行排序: 首先,整个求解过程其实就是在暴力枚举这些向量的组合,只不过采用了记忆化搜索优化. 其次,对于

UVA11991Easy Problem from Rujia Liu?(map + vector)

题目:UVA11991Easy Problem from Rujia Liu?(map + vector) 题目大意:给你N个数字,这些数字可能有重复,然后M个查询,问第k个V的下标是,如果不存在这样的数字输出0. 解题思路:用map来将每个数字和下标做一一映射,但是因为相同数字会出现多次,所以需要一个数组,并且长度不一定,所以用vector. 代码: #include <cstdio> #include <map> #include <vector> using na

UVA - 10895Matrix Transpose(vector)

题目:UVA - 10895Matrix Transpose(vector) 题目大意:给出一个矩阵求它的转置矩阵. 解题思路:因为数组可以达到10000 * 10000 然后里面非0的数最多1000,所以用vector数组来存储. 代码: #include <cstdio> #include <cstring> #include <vector> using namespace std; const int N = 10005; struct Mat { int th

map,vector 等容器内容的循环删除问题(C++)

map,vector 等容器内容的循环删除问题(C++) map,vector等容器的循环删除不能用普通的方法删除: for(auto p=list.begin();p!=list.end();p++) list.erase(p); 类似的方式,会出错的,不信你调试试试 :) 这里使用了一个` iterator` 的一个自增/自减 ,来巧妙的实现了, 删除当前的`iterator,` 但是有给当前的`iterator`赋值为其下一个的操作,不至于删除后,当前的 `iterator` 就失效了!

c++如何遍历删除map/vector里面的元素

新技能Get! 问题 对于c++里面的容器, 我们可以使用iterator进行方便的遍历. 但是当我们通过iterator对vector/map等进行修改时, 我们就要小心了, 因为操作往往会导致iterator失效, 之后的行为都变得不可预知. 比如: #include <iostream> #include <vector> using namespace std; int main() { vector<int> a = {12, 23, 34, 45, 56,