题目描述
彼特爷爷在为百年之后的大计做准备,打算将经营了几代人的银号生意作为遗产,传承给子孙们。他拥有金融大街上 n 个门牌号连续的房子,每个房子都有一个标价 wi(部分相邻的房子标价是一样的),而且整条街的房子标号是一个单调不下降的序列。
现将其中若千个房子分给 m 个子孙,因为继承者们能力各异,所以彼特爷爷做了一个偏心的操作:继承者们会分别得到一个标价,如果一个继承者的标价牌为 x,那他将获得标价为 x 的所有房子(这些房子的门牌号都是连续的)。
机智的继承者们知道,他只需要找到标价相同、门牌号最小的那个房子即可。
输入格式
第一行包含两个整数 n 和 mm ,表示彼特爷爷拥有的 n 个房产和拥有财产继承权的子孙人数 m 。
第二行包含 n 个整数 wi,房子的门牌号为 i 对应价值为 W。
接下来m行,每行一个整数,表示当前子孙拿到的标价牌。
输出格式
共 m 行,每行一个整数,表示该子孙的房产编号。
样例数据
输入样例 #1 | 输出样例 #1 |
---|---|
5 3 2 5 8 12 30 5 12 2 | 2 4 1 |
样例分析
如上所述。
数据范围
对于 100% 的数据:1≤m≤n≤10^5,1≤wi≤10^9 。
解题:
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int main(){
int n,m,w[100005]={},lo,hi,mid,ans,k;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&w[i]);
sort(w+1,w+1+n);
for(int i=1;i<=m;i++){
scanf("%d",&k);
lo=1;
hi=n;
while(lo<=hi){
mid=(lo+hi)/2;
if(w[mid]>k)hi=mid-1;
if(w[mid]<k)lo=mid+1;
if(w[mid]==k){
ans=mid;
hi=mid-1;
break;
}
}
printf("%d\n",ans);
}
return 0;
}