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