二分强化——全面查询
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 }