|
发表于 2023-11-22 21:23:38
|
显示全部楼层
二分查找的循环条件应该是 l <= r,而不是 l < r。因此需要将 while 循环中的条件改为 l <= r。此外,mid 的计算应该是 l + (r - l) / 2,而不是 l + (r - l)。这样可以保证在每次循环中,mid 的计算是正确的。另外,在输出答案时,应该输出 l 而不是 l+1。
修改后的代码如下:
- #include <bits/stdc++.h>
- using namespace std;
- const int N=2e5;
- typedef long long ll;
- ll a[N],b[N];
- int n,m;
- int main()
- {
- cin>>n>>m;
- vector<ll>c(n+m);
- for(int i=0;i<n;i++)
- {
- cin>>a[ i];
- c[ i]=a[ i];
- }
- for(int j=0;j<m;j++)
- {
- cin>>b[j];
- c[n+j]=b[j];
- }
- sort(c.begin(),c.end());
- for(int i=0;i<m;i++)
- {
- ll ans=b[ i],r=0,l=c.size()-1,cnt=0;
- while(l<=r)
- {
- ll mid=l+(r-l)/2;
- if(c[mid]>=ans) r=mid-1;
- else l=mid+1;
- }
- cout<<l<<" ";
- }
- }
复制代码 |
|