6 条题解

  • 0
    @ 2024-4-10 20:16:51

    一种全新的思路来解决二分问题

    不需要仔细思考边界问题

    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<string>
    using namespace std;
    int n,q;
    
    const int N=100010;
    int nums[N];
    int front_find(int target){
    	int l=-1,r=n;
    	while(l+1!=r){
    		int mid=l+r>>1;
    		if(nums[mid]<target) l=mid;
    		else r=mid;
    	}
    	if(r==n || nums[r]!=target) return -1;
    	else return r;
    }
    int end_fond(int target){
    	int l=-1,r=n;
    	while(l+1!=r){
    		int mid=l+r>>1;
    		if(nums[mid]>target) r=mid;
    		else l=mid;
    	}
    	if(l==-1 || nums[l]!=target) return -1;
    	else return l;
    }
    void slove(){
    	int target;
    	cin>>target;
    	int l=front_find(target);
    	if(l!=-1){
    		int r=end_fond(target);
    		cout<<l<<" "<<r<<endl;
    	}
    	else cout<<"-1 -1"<<endl;
    	
    }
    int main(){
    	cin>>n>>q;
    	for(int i=0;i<n;i++) scanf("%d",&nums[i]);
    	while(q--) slove();
    
    	return 0;
    }
    

    信息

    ID
    88
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    655
    已通过
    149
    上传者