hdu 5233 Gunner II(数据离散化存储)

来源:互联网 发布:淘宝联盟查找订单号 编辑:程序博客网 时间:2024/06/05 06:00

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 51 2 3 4 11 3 1 4 2
 

Sample Output
13542
http://acm.hdu.edu.cn/showproblem.php?pid=5233

用map<int,queue>会超时。还是老老实实地用数组吧。。。或者可以用map<int,int>离散化再对应queue<int>

#include <stdio.h>  #include <string.h>  #include <iostream>  #include <algorithm>  #include <vector>  #include <queue>  #include <stack>  #include <set>  #include <map>  #include <string>  #include <math.h>  #include <stdlib.h>  #include <time.h>  using namespace std;  const int N=1E5+5;  struct mapp{      int h,p;  }a[N];  int n,m,p,x,h[N],f[N];      int comp(const mapp&a,const mapp&b)  {      if (a.h==b.h) return a.p<b.p;      return a.h<b.h;  }    int main()  {      while (cin>>n>>m)      {          for (int i=1;i<=n;i++) scanf("%d",&a[i].h),a[i].p=i;          sort(a+1,a+n+1,comp);          for (int i=1;i<=n;i++) f[i]=i,h[i]=a[i].h; //h[]以从小到大存高度,f[]能用到的部分表示每种高度的第一位置         for (int i=1;i<=m;i++)          {              scanf("%d",&x);              p=lower_bound(h+1,h+n+1,x)-h;              if (h[f[p]]!=x) { printf("-1\n"); continue; }              printf("%d\n",a[f[p]].p);              f[p]++; //由该高度的第一位置转到第二位置         }      }      return 0; }  

或:

#include <stdio.h>#include <string.h>#include <queue>#include <map>#include <algorithm>using namespace std;typedef __int64 ll;const int maxn=100000+10;queue<int> que[maxn];int main(){    int i,n,j,m,t;    while(scanf("%d%d",&n,&m)!=EOF){        for(i=1;i<=n;i++)            while(!que[i].empty())                que[i].pop();        map<int,int> mp;        int cnt=1;        for(i=1;i<=n;i++){            scanf("%d",&t);            int tt=mp[t];            if(tt)                que[tt].push(i);            else {                    mp[t]=cnt++;                que[cnt-1].push(i);            }        }        while(m--){            scanf("%d",&t);            int tt=mp[t];            if(que[tt].empty())                printf("-1\n");            else {                printf("%d\n",que[tt].front());                que[tt].pop();            }        }    }    return 0;}


0 0