二分强化——全面查询
给出一个从递增的正整数序列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<stdio.h> 2 int s[100005],mid,x; 3 void solve(int c,int n,int s[]) 4 { 5 int l=-1,r=n; 6 while(l+1<r) 7 { 8 mid=(l+r)/2; 9 if(s[mid]>c)///找右界的 10 r=mid; 11 else 12 l=mid; 13 } 14 if(s[l]==c) 15 printf("%d\n",l); 16 else 17 printf("-1\n"); 18 } 19 void pk(int c,int n,int s[]) 20 { 21 int l=-1,r=n; 22 while(l+1<r) 23 { 24 mid=(l+r)/2; 25 if(s[mid]>=c)///找左界的 26 r=mid; 27 else 28 l=mid; 29 } 30 if(s[r]==c) 31 printf("%d\n",r); 32 else 33 printf("-1\n"); 34 } 35 void da(int c,int n,int s[]) 36 { 37 int l=-1,r=n; 38 while(l+1<r) 39 { 40 mid=(l+r)/2; 41 if(s[mid]>c) 42 r=mid; 43 else 44 l=mid; 45 } 46 if(s[l+1]!=0) 47 printf("%d\n",s[l+1]); 48 else 49 printf("-1\n"); 50 } 51 void xiao(int c,int n,int s[]) 52 { 53 int l=-1,r=n; 54 while(l+1<r) 55 { 56 mid=(l+r)/2; 57 if(s[mid]>=c) 58 r=mid; 59 else 60 l=mid; 61 } 62 if(s[r-1]!=0) 63 printf("%d\n",s[r-1]); 64 else 65 printf("-1\n"); 66 } 67 void super(int a,int b,int n,int s[]) 68 { 69 int l=-1,r=n; 70 while(l+1<r) 71 { 72 mid=(l+r)/2; 73 if(s[mid]>=a) 74 r=mid; 75 else 76 l=mid; 77 } 78 x=r; 79 l=-1,r=n; 80 while(l+1<r) 81 { 82 mid=(l+r)/2; 83 if(s[mid]>b) 84 r=mid; 85 else 86 l=mid; 87 } 88 printf("%d\n",l-x+1); 89 } 90 91 92 int main() 93 { 94 int n,i,q,x,a,b,c; 95 scanf("%d",&n);///题目有5个不同的查询 写了5个自定义函数 96 for(i=0; i<n; i++) 97 { 98 scanf("%d",&s[i]); 99 } 100 scanf("%d",&q); 101 while(q--) 102 { 103 scanf("%d",&x); 104 if(x==2) 105 { 106 scanf("%d%d",&a,&b); 107 super(a,b,n,s); 108 } 109 else 110 { 111 scanf("%d",&c); 112 if(x==0) 113 { 114 solve(c,n,s); 115 } 116 if(x==1) 117 { 118 pk(c,n,s); 119 } 120 if(x==3) 121 { 122 da(c,n,s); 123 } 124 if(x==4) 125 { 126 xiao(c,n,s); 127 } 128 } 129 } 130 }