2 条题解

  • 0
    @ 2025-9-14 17:30:17

    水个c++ ac代码

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    int n,q,a[100100];
    //l<r`最终l==r l即为最终答案 需要缩小范围l=mid+1 r=mid-1(不然会死循环)
    //l<r-1 最终l与r相邻 不需要缩小范围 但是最后要判断l和r是否符合
    void ch1(int l,int r,int x){
        int mid=(l+r)/2;
        while(l<r-1){
            mid=(l+r)/2;
            if(a[mid]>=x){
               r=mid;
            }
            else l=mid;
        }
        if(x==a[l])cout<<l<<endl;
        else if(x==a[r])cout<<r<<endl;
        else cout<<-1<<endl;
       
    }
    void ch2(int l,int r,int x){
        int mid=(l+r)/2;
        while(l<r-1){
            mid=(l+r)/2;
            if(a[mid]<=x){
                l=mid;
            }
            else r=mid;
        }
        if(a[r]==x)cout<<r<<endl;
        else if(a[l]==x)cout<<l<<endl;
        else cout<<-1<<endl;
    }
    void ch3(int l,int r,int x){
        int mid=(l+r)/2;
        while(l<r){
            mid=(l+r)/2;
            if(a[mid]>=x){
                r=mid;
            }
            else l=mid+1;
        }
        if(a[r]>=x)cout<<r<<endl;
        else cout<<-1<<endl;
    }
    void ch4(int l,int r,int x){
        int mid=(l+r)/2;
        while(l<r){
            mid=(l+r)/2;
            if(a[mid]>x){
                r=mid;
            }
            else l=mid+1;
        }
        if(a[l]>x)cout<<l<<endl;
        else cout<<-1<<endl;
    }
    signed main(){
        cin>>n>>q;
        for(int i=1;i<=n;i++){
        cin>>a[i];
    }
        for(int i=1;i<=q;i++){
            int op,l,r,x;
            cin>>op>>l>>r>>x;
            if(op==1){
                ch1(l,r,x);
            }
            if(op==2){
                ch2(l,r,x);
            }
            if(op==3){
                ch3(l,r,x);
            }
            if(op==4){
                ch4(l,r,x);
            }
        }
            return 0;
    }
    
    • 0
      @ 2025-5-8 22:04:15

      蓝桥云课AC代码 JAVA: 判断条件应为区间,选那种二分看最终点在区间的左端还是右端。

      int l=0,r=n;
      while(l<r){
        int mid=(l+r)>>1;
        if(判断条件) r=mid;
        else l=mid+1;
      }
      out.println(l);
      out.close();
      
      int l=0,r=n;
      while(l<r){
        int mid=(l+r+1)>>1;
        if(判断条件) r=mid-1;
        else l=mid;
      }
      out.println(l);
      out.close();
      
      
      import java.util.*;
      import java.util.StringTokenizer;
      import java.io.*;
      
      public class Main {
      
      	public static void main(String[] args) {
      		//数据读入
      		int n=in.nextInt();
      		int q=in.nextInt();
      		int[] a=new int[n+1];
      		for(int i=1;i<=n;i++){
      			a[i]=in.nextInt();
      		}
      		
      		while(q-->0){
      			int op=in.nextInt(),l=in.nextInt(),r=in.nextInt(),x=in.nextInt();
      			if(op==1) out.println(getL(a,l,r,x));
      			else if(op==2) out.println(getR(a,l,r,x));
      			else if(op==3) out.println(lower_bound(a,l,r,x));
      			else out.println(upper_bound(a,l,r,x));
      		}
      		out.close();
      	}
      	
      	
      
      	private static int upper_bound(int[] a, int l, int r, int x) {
      		if(a[r]<=x) return -1;
      		while(l<r) {
      			int mid=(l+r)/2;
      			if(a[mid]>x) r=mid;
      			else l=mid+1;
      		}
      		return l;
      	}
      
      
      
      	private static int lower_bound(int[] a, int l, int r, int x) {
      		if(a[r]<x) return -1;
      		while(l<r) {
      			int mid=(l+r)/2;
      			if(a[mid]>=x) r=mid;
      			else l=mid+1;
      		}
      		return l;
      	}
      
      
      
      	private static int getR(int[] a, int l, int r, int x) {
      		while(l<r) {
      			int mid=(l+r+1)/2;
      			if(a[mid]>x) r=mid-1;
      			else l=mid;
      		}
      		if(a[l]!=x) return -1;
      		else return l;
      	}
      
      
      
      	private static int getL(int[] a, int l, int r, int x) {
      		while(l<r) {
      			int mid=(l+r)/2;
      			if(a[mid]>=x) r=mid;
      			else l=mid+1;
      		}
      		if(a[l]!=x) return -1;
      		else return l;
      	}
      
      
      
      	static FastReader in=new FastReader();
      	static PrintWriter out=new PrintWriter(System.out);
      	static class FastReader{
      		static BufferedReader br;
      		static StringTokenizer st;
      		FastReader(){
      			br=new BufferedReader(new InputStreamReader(System.in));
      		}
      		String next() {
      			String str="";
      			while(st==null||!st.hasMoreElements()) {
      				try {
      					str=br.readLine();
      				}catch(IOException e) {
      					throw new RuntimeException(e);
      				}
      				st=new StringTokenizer(str);
      			}
      			return st.nextToken();
      		}
      		int nextInt() {
      			return Integer.parseInt(next());
      		}
      		double nextDouble() {
      			return Double.parseDouble(next());
      		}
      		long nextLong() {
      			return Long.parseLong(next());
      		}
      	}
      	
      }
      
      
      • 1

      信息

      ID
      39
      时间
      1000ms
      内存
      256MiB
      难度
      3
      标签
      递交数
      95
      已通过
      26
      上传者