Gunner II (离散化 map + set ) HDU 5233

Problem Description
Long long ago, there was a gunner whose name is Jack. He likes to go hunting very much. One day he go to the grove. There are n birds and n trees. The i-th bird stands on the top of the i-th tree. The trees stand in straight line from left to the right. Every tree has its height. Jack stands on the left side of the left most tree. When Jack shots a bullet in height H to the right, the nearest bird which stands in the tree with height H will falls.

Jack will shot many times, he wants to know which bird will fall during each shot.
 
Input
There are multiple test cases (about 5), every case gives n, m in the first line, n indicates there are n trees and n birds, m means Jack will shot m times. 

In the second line, there are n numbers h[1],h[2],h[3],…,h[n] which describes the height of the trees.

In the third line, there are m numbers q[1],q[2],q[3],…,q[m] which describes the height of the Jack’s shots.

Please process to the end of file.

[Technical Specification]

All input items are integers.

1<=n,m<=100000(10^5)

1<=h[i],q[i]<=1000000000(10^9)
 
Output
For each q[i], output an integer in a single line indicates the id of bird Jack shots down. If Jack can’t shot any bird, just output -1.

The id starts from 1.
 
Sample Input
5 5 1 2 3 4 1 1 3 1 4 2
 
Sample Output
1 3 5 4 2
Hint
Huge input, fast IO is recommended.
 
Source
 
 
 
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <cmath>
using namespace std;
const int INT=1e6+5;
typedef long long ll;
#define pql priority_queue<ll>
#define pq priority_queue<int>
#define v vector<int>
#define vl vector<ll>
#define lson rt<<1, l, m
#define rson rt<<1|1, m+1, r
#define read(x) scanf("%d",&x)
#define lread(x) scanf("%lld",&x);
#define pt(x) printf("%d\n",(x))
#define yes printf("YES\n");
#define no printf("NO\n");
#define gcd __gcd
#define cn(n) cin>>n;
#define line cout<<endl;
#define rep(j,k) for (int i = (int)(j); i <= (int)(k); i++)
#define input(k) for (int i = 1; i <= (int)(k); i++)  {cin>>a[i] ; }
#define mem(s,t) memset(s,t,sizeof(s))
#define ok return 0;
#define TLE std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);

int main()
{
    TLE;
    int n,m,k;
    while(cin>>n>>m)
    {
        map<int ,set<int> >me;
        set<int>::iterator it;
        for(int i=1;i<=n;i++)
        {
            cin>>k;
            me[k].insert(i);
        }
        for(int i=1;i<=m;i++)
        {
            cin>>k;
            if(me[k].empty())
                cout<<-1<<endl;
            else
            {
                it = me[k].begin();
                cout<<*it<<endl;
                me[k].erase(it);
            }
        }
    }
    ok;
}
 

猜你喜欢

转载自www.cnblogs.com/Shallow-dream/p/11530624.html