题意:很久很久以前,有一个叫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("*****
");
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
");
49 }
50 else
51 {
52 printf("%d
",*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
");
38 else if(bird[id].empty())
39 printf("-1
");
40 else
41 {
42 printf("%d
",*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 }