B. Taxi drivers and Lyft
http://codeforces.com/problemset/problem/1075/B
二分查找相邻司机,比较距离后确定最终结果。
lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。返回地址减去起始地址begin,得到下标。
upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。返回地址减去起始地址begin,得到下标。
#include <bits/stdc++.h>
using namespace std;
int out[100005];
int driver[100005];
int temp[200005];
int rider[100005];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<n+m;i++)
cin>>temp[i];
int dr=0,ri=0;
for(int i=0;i<n+m;i++){
int t;
cin>>t;
if(t)
driver[dr++]=temp[i];
else
rider[ri++]=temp[i];
}
memset(out,0,sizeof(out));
for(int i=0;i<n;i++){
int judge=lower_bound(driver,driver+m,rider[i])-driver;
if(judge==0)
out[judge]++;
else if(judge!=m && rider[i]-driver[judge-1]>driver[judge]-rider[i])
out[judge]++;
else
out[judge-1]++;
}
for(int i=0;i<m;i++)
cout<<out[i]<<" ";
return 0;
}