hdu 5233 离散化 **

题意:很久很久以前,有一个叫Jack的枪手。他非常喜欢打猎。一天,他去了一个小树林。那儿有n只鸟,还有n棵树。第i只鸟站在第i棵树的顶端。这些树从左到右排成一条直线。每一棵树都有它的高度。Jack站在最左边那棵树的左边。当Jack在高度为H的地方向右发射一棵子弹时,站在高度为H的树上且离Jack最近的鸟儿就会落下来。
Jack会射击多次,他想知道每次射击哪只鸟儿会落下来。

怎么看都是以前出过的题啊,但还是不会

明早起来拍一遍

2015-05-26:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #include<map>
 8 #include<set>
 9 using namespace std;
10 #define MOD 1000000007
11 const int INF=0x3f3f3f3f;
12 const double eps=1e-5;
13 typedef long long ll;
14 #define cl(a) memset(a,0,sizeof(a))
15 #define ts printf("*****\n");
16 const int MAXN=100005;
17 int a[MAXN],b[MAXN];
18 int n,m,tt;
19 set<int> vc[MAXN];
20 int main()
21 {
22     int i,j,k;
23     #ifndef ONLINE_JUDGE
24     freopen("1.in","r",stdin);
25     #endif
26     while(scanf("%d%d",&n,&m)!=EOF)
27     {
28         for(i=0;i<n;i++)
29         {
30             scanf("%d",a+i);
31             b[i]=a[i];
32         }
33         sort(b,b+n);
34         int num=unique(b,b+n)-b-1;
35         for(i=0;i<=num;++i)
36             vc[i].clear();
37         for(i=0;i<n;i++)
38         {
39             vc[lower_bound(b,b+num,a[i])-b].insert(i);   //vc[高度]=编号,高度是离散化之后的高度
40         }
41         int H;
42         for(i=0;i<m;i++)
43         {
44             scanf("%d",&H);
45             int HH=lower_bound(b,b+num,H)-b;
46             if(b[HH]!=H||vc[HH].empty())
47             {
48                 printf("-1\n");
49             }
50             else
51             {
52                 printf("%d\n",*vc[HH].begin()+1);
53                 vc[HH].erase(vc[HH].begin());
54             }
55         }
56     }
57 }

 

 
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<set>
 9 #define maxn 100010
10 using namespace std;
11 typedef long long LL;
12 typedef unsigned long long ULL;
13 set<int> bird[maxn];
14 int n,m,tn,h[maxn];
15 int tmp[maxn];
16 void read()
17 {
18     for(int i=1;i<=n;++i)
19     {
20         scanf("%d",h+i);
21         tmp[i]=h[i];
22     }
23     sort(tmp+1,tmp+n+1);
24     tn=unique(tmp+1,tmp+n+1)-tmp-1;
25     for(int i=1;i<=tn;++i)
26         bird[i].clear();
27     for(int i=1;i<=n;++i)
28         bird[lower_bound(tmp+1,tmp+tn+1,h[i])-tmp].insert(i);
29 }
30 void Query()
31 {
32     for(int i=1,x;i<=m;++i)
33     {
34         scanf("%d",&x);
35         int id=lower_bound(tmp+1,tmp+tn+1,x)-tmp;
36         if(tmp[id]!=x)  //没找到
37             printf("-1\n");
38         else if(bird[id].empty())
39             printf("-1\n");
40         else
41         {
42             printf("%d\n",*bird[id].begin());
43             bird[id].erase(bird[id].begin());
44         }
45     }
46 }
47 int main()
48 {
49     while(cin>>n>>m)
50     {
51         read();
52         Query();
53     }
54     return 0;
55 }

 




posted @ 2015-05-25 23:59  miao_a_miao  阅读(195)  评论(0编辑  收藏  举报