相关题目:
数的范围https://www.acwing.com/problem/content/791/
解法1:
#include<iostream>
using namespace std;
int n,q;
int a[100001];
int s[10001]; //存放的是起始位置,下标是所对应的数。
int c[10001]; //存放的是出现的次数,下标是所对应的数。
int e[10001]; //存放的是终止位置,下标是所对应的数。
int main(){
cin>>n>>q;
for(int i=0;i<10001;i++){
s[i]=-1;
e[i]=-1;
}
for(int i=0;i<n;i++){
cin>>a[i];
c[a[i]]++;
if(c[a[i]]==1){
s[a[i]]=i;
e[a[i]]=i;
}
else{
e[a[i]]=i;
}
}
int temp;
for(int i=0;i<q;i++){
cin>>temp;
cout<<s[temp]<<" "<<e[temp]<<endl;
}
return 0;
}
解法2:
/*
这道题是一道练习二分法比较好的题目,并且二分法的两个模板都得到了充分的体现。
*/
#include<iostream>
using namespace std;
int a[100001];
int n;
int q;
int temp;
int main(){
cin>>n>>q;
for(int i=0;i<n;i++){
cin>>a[i];
}
while(q--){
cin>>temp;
int l = 0;
int r = n-1;
//首先找出目标元素的起始位置。
while(l<r){
int mid = (l+r)/2;
if(a[mid]>=temp){
r=mid;
}
else{
l=mid+1;
}
}
if(temp!=a[l]){
cout<<"-1 -1"<<endl;
}
else{
cout << l << ' ';
int l=0;
int r=n-1;
while(l<r){
int mid = (l+r+1)/2;
if(a[mid]<=temp){
l=mid;
}
else{
r=mid-1;
}
}
cout<<l<<endl;
}
}
return 0;
}