Map Vector Set (离散的使用)

hdu   5233    gunner

原来这样就可以快速读入:

while(~scanf("%ld%ld\n",&n,&m)){
        gets(c+1);
        l=strlen(c+1);
        a[1].x =0;
        for(int i=1,j=1;i<=l;++i){
            if(c[i]!=' ')a[j].x=a[j].x*10+c[i]-'0';
            else a[++j].x=0;
        }

1.对树的高度和打枪的高度分别排序,用数组离线(按打枪顺序)存储结果:

const int maxn=105000;
struct node
{
    int High;
    int Id;
} A[maxn],B[maxn];
int C[maxn];

int cmp(node x,node y)
{
    if(x.High==y.High)
        return x.Id<y.Id;
    return x.High<y.High;
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.cpp","r",stdin);
#endif // ONLINE_JUDGE
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        memset(C,-1,sizeof(C));
        for(int i=0; i<n; i++)
        {
            scanf("%d",&A[i].High);
            A[i].Id=i+1;
        }
        sort(A,A+n,cmp);
        for(int i=0; i<m; i++)
        {
            scanf("%d",&B[i].High);
            B[i].Id=i;
        }
        sort(B,B+m,cmp);
        int j=0;
        for(int i=0; i<n; i++)
        {
            if(A[i].High>B[j].High)  {   C[B[j++].Id]=-1; i-=1;}
            else if(A[i].High<B[j].High)
                continue;
            else
                C[B[j++].Id]=A[i].Id;
            if(j==m)  break;

        }
        for(int i=0; i<m; i++)
            printf("%d\n",C[i]);
    }
    return 0;
}

2. 对每一次打枪,用Map找到所打高度的位置,在输入时用Set数组或Vector数组存储树的顺序;

离线的做法:找出所有不同的高度(最多1e5),用Map找该高度的位置。

const int maxn=100005;
vector<int> G[maxn];
map<int ,int> Mp;
set<int> S[maxn];
int p[maxn];

int main()
{
    #ifndef ONLINE_JUDGE
    freopen("in.cpp","r",stdin);
#endif // ONLINE_JUDGE
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=0;i<=n;i++)
            S[i].clear();
         Mp.clear();
        int cur,a;
        int cnt=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a);
            if(!Mp.count(a))  Mp[a]=++cnt;
            cur=Mp[a];
            S[cur].insert(i);
        }
        while(m--)
        {
            int b;
            scanf("%d",&b);
            if(!Mp.count(b)) puts("-1");
            else
            {
               cur=Mp[b];
               if(!S[cur].size())
                puts("-1");
               else
               {
                   printf("%d\n",*S[cur].begin());
                   S[cur].erase( S[cur].begin());
               }

            }

        }
    }
    return 0;
}

3. 将上面的Set 改为Vector二维数组存储即可

vector<int>G[maxn];
int cnt,p[maxn];
map<int,int>mp;
int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.cpp","r",stdin);
#endif // ONLINE_JUDGE
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        mp.clear();
        for(int i=1;i<=n;i++)
            G[i].clear();
        cnt=0;
        int cur;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&h[i]);
            if(!mp.count(h[i]))
            {
                mp[h[i]]=++cnt;
            }
            cur=mp[h[i]];
            G[cur].push_back(i);
        }
        for(int i=0;i<=cnt;i++)
            p[i]=0;
        while(m--)
        {
            scanf("%d",&cur);
            if(!mp.count(cur))
            {
                puts("-1");
                continue;
            }
            cur=mp[cur];
            if(p[cur]>=(int)G[cur].size())
            {
                puts("-1");
                continue;
            }
            printf("%d\n",G[cur][p[cur]]);
            p[cur]++;
        }
    }
    return 0;
}
时间: 2024-10-10 13:41:48

Map Vector Set (离散的使用)的相关文章

hdu 4941 map的应用+离散

1 #include<iostream> 2 #include<cstdio> 3 #include<map> 4 #include<algorithm> 5 using namespace std; 6 7 int main() 8 { 9 int T,n,m,k,a,b,c,q,cas=1; 10 scanf("%d",&T); 11 while(T--) 12 { 13 map<int,map<int,int&g

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

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,

map/vector erase

问题核心:erase之后迭代器是否失效 vector调用erase之后,该迭代器之后的迭代器都失效: map调用erase之后,其他迭代器并不会失效. 1 vector<int> vecData; 2 for (typeof(vecData.begin()) it; it != vecData.end();) 3 { 4 if (*it == 1) 5 { 6 it = vecData.erase(it); 7 //vv.erase(it++); //vector erase之后,it迭代器后

几种常见 容器 比较和分析 hashmap, map, vector, list .

list支持快速的插入和删除,但是查找费时; vector支持快速的查找,但是插入费时. map查找的时间复杂度是对数的,这几乎是最快的,hash也是对数的. 如果我自己写,我也会用二叉检索树,它在大部分情况下可以保证对数复杂度,最坏情况是常数复杂度,而std::map在任何情况下都可以保证对数复杂度,原因是它保证存诸结构是完全二叉检索树,但这会在存诸上牺牲一些时间. STL   中的   map   内部是平衡二叉树,所以平衡二叉树的性质都具备.查找数据的时间也是对数时间.vector,在分配

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,

STL map vector(不定长数组)

啊啊啊!记住啊   多看几遍应该就好. 1 #include<cstdio> 2 #include<iostream> 3 #include<string> 4 #include<cctype>//1.测试字符ctype.h是C标准函数库中的头文件,定义了一批C语言字符分类函数(C character classification functions),用于测试字符是否属于特定的字符类别,如字母字符.控制字符等等.既支持单字节字符,也支持宽字符. 5 #in

ACM: NBUT 1646 Internet of Lights and Switches - 二进制+map+vector

NBUT 1646 Internet of Lights and Switches Time Limit:5000MS     Memory Limit:65535KB     64bit IO Format: You are a fan of "Internet of Things"(IoT, 物联网), so you build a nice Internet of Lights and Switches in your huge mansion. Formally, there