二分基础(模板题)

二分强化——全面查询

TimeLimit:2000MS  MemoryLimit:128MB
64-bit integer IO format:%lld
已解决 | 点击收藏 | 已有5人收藏了本题
Problem Description

给出一个从递增的正整数序列a0,a1……an-1
对不同的查询输出对应结果

Input

只有一组数据
第一行是一个整数n,代表序列的长度(下标从0开始一直到n-1)
接下来n个整数,代表序列对应位置上的数
再接下来一行是一个整数m代表查询次数
接下来m行
接下来的每行是这5种类型之一
0 x    代表查询数字x出现的最大下标,若不存在x输出-1
1 x    代表查询数字x出现的最小下标,若不存在x输出-1
2 x y  代表查询大于等于x且小于等于y的数字的个数,并保证x<=y
3 x    代表查询比x大且下标最小的数字的大小,若不存在比x大的数字输出-1
4 x    代表查询比x小且下标最大的数字的大小,若不存在比x小的数字输出-1
n,m<10^5
0<=ai,x,y<10^9

Output

输出对应结果,每个结果占一行

SampleInput
10 
1 1 1 3 4 5 5 5 5 8
5
0 5
1 5
2 1 5
3 4
4 8
SampleOutput
8
5
9
5
5
  1 #include <iostream>
  2 #include <cstring>
  3 #include <algorithm>
  4 
  5 using namespace std;
  6 
  7 int arr[100005];
  8 int n,t;
  9 
 10 int Binaryone(int x){
 11     int left=0,right=n-1,ans,flag=0;
 12     while(left<=right){
 13         int mid=left+right>>1;
 14         if(arr[mid]<=x) left=mid+1,ans=mid;
 15         else if(arr[mid]>x){
 16             right=mid-1;
 17 //            if(arr[mid]==x&&flag==0){
 18 //                while(arr[mid]==x&&mid<n){
 19 //                    mid++;
 20 //                }
 21 //                ans=mid-1;
 22 //                flag=1;
 23 //            }
 24         }
 25     }
 26     return ans;
 27 }
 28 
 29 int Binarytwo(int x){
 30     int left=0,right=n-1,ans,flag=0;
 31     while(left<=right){
 32         int mid=left+right>>1;
 33         if(arr[mid]<x) left=mid+1;
 34         else if(arr[mid]>=x){
 35             right=mid-1;
 36             ans=mid;
 37         }
 38     }
 39     return ans;
 40 }
 41 
 42 
 43 int Binarythree(int x){
 44     int left=0,right=n-1,ans,flag=0;
 45     while(left<=right){
 46         int mid=left+right>>1;
 47         if(arr[mid]<=x) left=mid+1;
 48         else if(arr[mid]>x){
 49             right=mid-1;
 50             ans=mid;
 51         }
 52     }
 53     return arr[ans]>x?arr[ans]:-1;
 54 }
 55 
 56 int Binaryfour(int x){
 57     int left=0,right=n-1,ans,flag=0;
 58     while(left<=right){
 59         int mid=left+right>>1;
 60         if(arr[mid]<x) left=mid+1,ans=mid;
 61         else if(arr[mid]>=x){
 62             right=mid-1;
 63         }
 64     }
 65     return arr[ans]<x?arr[ans]:-1;
 66 }
 67 
 68 
 69 
 70 int main(){
 71     ios::sync_with_stdio(false);
 72     cin>>n;
 73     for(int i=0;i<n;i++) cin>>arr[i];
 74     cin>>t;
 75     int date;
 76     while(t--){
 77         cin>>date;
 78         int x,y;
 79         if(date==0){
 80             cin>>x;
 81             int zhi=Binaryone(x);
 82             if(arr[zhi]==x) cout << zhi << endl;
 83             else cout << -1 << endl;
 84         }
 85         else if(date==1){
 86             cin>>x;
 87             int zhi=Binarytwo(x);
 88             if(arr[zhi]==x) cout << zhi << endl;
 89             else cout << -1 << endl;
 90         }
 91         else if(date==2){
 92             cin>>x>>y;
 93             cout << Binaryone(y)-Binarytwo(x)+1 << endl;
 94         }
 95         else if(date==3){
 96             cin>>x;
 97             cout << Binarythree(x) << endl;
 98         }
 99         else if(date==4){
100             cin>>x;
101             cout << Binaryfour(x) << endl;
102         }
103     }
104     return 0;
105 }
View Code

 

posted @ 2019-07-30 15:13  厂长在线养猪  Views(161)  Comments(0Edit  收藏  举报