二分强化——全面查询

给出一个从递增的正整数序列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 }

 

posted @ 2017-12-28 19:38  star_fish  阅读(208)  评论(0编辑  收藏  举报