HDu 5233

#include <cstdio>
#include <iostream>
#include <set>
#include <algorithm>
#include <cstring>

using namespace std;
#define maxn 100000 + 10

//保存每个高度所包含的位置

set<int> S[maxn];
int n, m;
int len;
int h[maxn], t[maxn];

void read()
{
    for(int i=1; i<=n; i++)
    {
        scanf("%d", &h[i]);
        t[i] = h[i];
    }

    sort(t+1, t+n+1);
    len = unique(t+1, t+n+1) - (t+1);

    for(int k=1; k<=len; k++)
        S[k].clear();

    for(int i=1; i<=n; i++)
    {
        int tmp = lower_bound(t+1, t+len+1, h[i]) - t;
        S[tmp].insert(i);
    }
}

void solve()
{
    int q;
    for(int i=0; i<m; i++)
    {
        scanf("%d", &q);
        int id = lower_bound(t, t+len+1, q) - t;
        if(t[id] != q)
            printf("-1\n");
        else if(S[id].empty())
            printf("-1\n");
        else
        {
            printf("%d\n", *S[id].begin());
            S[id].erase(S[id].begin());
        }
    }
}

int main()
{
    while(~scanf("%d%d", &n, &m))
    {
        read();
        solve();
    }
    return 0;
}

时间: 2024-10-13 21:44:17

HDu 5233的相关文章

hdu 5233 Gunner II 离散化

Gunner II Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5233 Description 很久很久以前,有一个叫Jack的枪手.他非常喜欢打猎.一天,他去了一个小树林.那儿有n只鸟,还有n棵树.第i只鸟站在第i棵树的顶端.这些树从左到右排成一条直线.每一棵树都有它的高度.Jack站在最左边那棵树的左边.当Jack在高度为H的地方向右发射一棵子弹时,站在高度为

hdu 5233 Gunner II 【set+map】

题意不说了,之所以贴代码是因为想说容器是个很好的东西 #include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<set> #include<map> using namespace std; map<int,set<int> >mp; set<int>::iterator it; int

hdu 5233 Gunner II (bc #42 B)

Gunner II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1433    Accepted Submission(s): 540 Problem Description Long long ago, there was a gunner whose name is Jack. He likes to go hunting ver

hdu 5233 离散化 **

题意:很久很久以前,有一个叫Jack的枪手.他非常喜欢打猎.一天,他去了一个小树林.那儿有n只鸟,还有n棵树.第i只鸟站在第i棵树的顶端.这些树从左到右排成一条直线.每一棵树都有它的高度.Jack站在最左边那棵树的左边.当Jack在高度为H的地方向右发射一棵子弹时,站在高度为H的树上且离Jack最近的鸟儿就会落下来. Jack会射击多次,他想知道每次射击哪只鸟儿会落下来. 怎么看都是以前出过的题啊,但还是不会 明早起来拍一遍 1 #include<iostream> 2 #include<

hdu 5233 Gunner II

开始试了很多方法,不过由于删除的效率导致tle,总之无论什么方法,能ac就是好方法 #include<iostream> #include<vector> #include<map> using namespace std; vector<int>mapp[100000+5]; map<int,int>root; int he[100000+5]; int main() { int n,m; cin.sync_with_stdio(false);

HDU 5233 Gunner II (二分)

问题描述 很久很久以前,有一个叫Jack的枪手.他非常喜欢打猎.一天,他去了一个小树林.那儿有n只鸟,还有n棵树.第i只鸟站在第i棵树的顶端.这些树从左到右排成一条直线.每一棵树都有它的高度.Jack站在最左边那棵树的左边.当Jack在高度为H的地方向右发射一棵子弹时,站在高度为H的树上且离Jack最近的鸟儿就会落下来. Jack会射击多次,他想知道每次射击哪只鸟儿会落下来. 输入描述 多组测试数据(大概5组),每一组的第一行给出n,m,n表示有n棵树和n只鸟,m表示Jack会射击m次. 在第二

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 in

BestCoder #42题解(hdu 5232 &amp; 5233 &amp; 5234)

感觉这次的题目还是挺简单的. A :  如果两个人认识,那么就彼此各喝一杯酒,认识用1表示.另外主人肯定认识每一个人.数矩阵中的1加上人数n*2(主人的缘故). #include<iostream> #include<string> using namespace std; int s[40][40]; int main() { int n; while(cin>>n) { int ans=0; ans+=n*2; for(int i=1;i<=n;i++) fo

HDU ACM 5233 Gunner II

分析:借助STL的multiset实现,很方便. #include<iostream> #include<set> using namespace std; class Node { public: Node(int _h=0,int _pos=0):h(_h),pos(_pos) //注意_h一定要在_pos的前面,方便lower_bound的调用 { } int pos,h; }; struct cmp //仿函数 { bool operator()(const Node&am