Contest1157 - [竞赛班晚班]二分-动归2

2023-07-27 18:00:00
3333-07-27 22:00:00
运行中 公开 当前时间:2024-11-10 11:36:39

信息与公告

#include<bits/stdc++.h>
using namespace std;
int n, m, a[1000001];
//存在时   返回的下标:最左边的x的下标 
//不存在时 返回的是第一个大于x的下标 
//返回第一个>=x的位置 可能越界 想象右侧有无穷大的边界 
int findLeft(int x){
	int L=1, R=n; 
	while(L<=R){
		int mid=(L+R)/2;
		if(x<=a[mid]){//相等 往左找 
			R=mid-1;
		}else{
			L=mid+1;
		}
	}
	return L;//返回L 
}
//返回最后一个<=x的 R  最左边有无穷小的边界 
int findRight(int x){
	int L=1, R=n; 
	while(L<=R){
		int mid=(L+R)/2;
		if(x<a[mid]){
			R=mid-1;
		}else{
			L=mid+1;//相等 往右找 
		}
	}
	return R;//返回R
}

int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	cin>>m;//要查找的次数  
	while(m--){
		int x;
		cin>>x;
		int L=findLeft(x);
		int R=findRight(x);
		cout<<"findLeft 返回的L:"<<L<<endl;
		cout<<"findRight 返回的R:"<<R<<endl;
		
	}
	
	return 0;
} 
//(L+R)/2 左:R=mid-1;  右:L=mid+1;
//6
//1 2 2 3 3 3