AcWing 789. 数的范围

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing 789. 数的范围相关的知识,希望对你有一定的参考价值。

题目链接

https://www.acwing.com/problem/content/791/

思路

写一个划分x为左边界和有边界的整数二分方法即可

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000009
#define endl "\\n"
#define PII pair<int,int>
ll ksm(ll a,ll b) 
	ll ans = 1;
	for(;b;b>>=1LL) 
		if(b & 1) ans = ans * a % mod;
		a = a * a % mod;
	
	return ans;


ll lowbit(ll x)return -x & x;

const int N = 2e6+10;
int n,q,a[N];
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]
int findR(int l,int r,int x)
	while(l < r) 
		int mid = l + r + 1 >> 1;
		if(a[mid] <= x) l = mid;
		else r = mid - 1;
	
	return r;

// 区间[l, r]被划分成[l, mid]和[mid + 1, r]
int findL(int l,int r,int x)
	while(l < r) 
		int mid = l + r >> 1;
		if(a[mid] >= x) r = mid;
		else l = mid + 1;
	
	return r;


int main()

	scanf("%d%d",&n,&q);
	for(int i = 0;i < n; ++i) 
		scanf("%d",&a[i]);
	
	int x;
	while(q--)
		scanf("%d",&x);
		int k = findL(0,n-1,x);
		if(a[k] != x)
			printf("-1 -1\\n");
			continue;
		
		printf("%d ",k);
		k = findR(0,n-1,x);
		printf("%d\\n",k);
	
	
	return 0;

以上是关于AcWing 789. 数的范围的主要内容,如果未能解决你的问题,请参考以下文章

AcWing 789. 数的范围 二分+模板

ACwing_789. 数的范围

蓝桥杯AcWing 题目题解 - 二分与前缀和差分

789. 数的范围

算法789. 数的范围——二分

AcWing 787. 归并排序