CodeForces

Interesting drink

Problem

Vasiliy likes to rest after a hard work, so you may often meet him in some bar nearby. As all programmers do, he loves the famous drink "Beecola", which can be bought in n different shops in the city. It's known that the price of one bottle in the shop i is equal to xi coins.

Vasiliy plans to buy his favorite drink for q consecutive days. He knows, that on the i-th day he will be able to spent mi coins. Now, for each of the days he want to know in how many different shops he can buy a bottle of "Beecola".

Input

The first line of the input contains a single integer n (1 ≤ n ≤ 100 000) — the number of shops in the city that sell Vasiliy's favourite drink.

The second line contains n integers xi (1 ≤ xi ≤ 100 000) — prices of the bottles of the drink in the i-th shop.

The third line contains a single integer q (1 ≤ q ≤ 100 000) — the number of days Vasiliy plans to buy the drink.

Then follow q lines each containing one integer mi (1 ≤ mi ≤ 109) — the number of coins Vasiliy can spent on the i-th day.

Output

Print q integers. The i-th of them should be equal to the number of shops where Vasiliy will be able to buy a bottle of the drink on the i-th day.

Example
Input
5
3 10 8 6 11
4
1
10
3
11
Output
0
4
1
5
Note

On the first day, Vasiliy won't be able to buy a drink in any of the shops.

On the second day, Vasiliy can buy a drink in the shops 1, 2, 3 and 4.

On the third day, Vasiliy can buy a drink only in the shop number 1.

Finally, on the last day Vasiliy can buy a drink in any shop.

给出n个数,再输入若干个M,每输入一次M,求n个数里有多少个数小于M。
由于n是1e5的数量级,不可O(n^2)暴力,用二分即可。

 1 #include<stdio.h>  
 2     #include<string.h>  
 3     #include<algorithm>  
 4     using namespace std;  
 5     int a[100000+10];  
 6     int main()  
 7     {  
 8         int n,i,j,k,num,m;  
 9         while(scanf("%d",&n)!=EOF)  
10         {  
11             for(i=1;i<=n;i++)  
12             scanf("%d",&a[i]);  
13             sort(a+1,a+n+1);  
14             scanf("%d",&m);  
15             while(m--)  
16             {  
17                 scanf("%d",&num);  
18                 if(num<a[1])  
19                 printf("0
");  
20                 else if(num>=a[n])  
21                 printf("%d
",n);  
22                 else  
23                 {  
24                     int left=1;  
25                     int right=n;  
26                     int mid;  
27                     int ans;  
28                     while(left<=right)  
29                     {  
30                         mid=(left+right)/2;  
31                         if(a[mid]<=num)  
32                         {  
33                             ans=mid;  
34                             left=mid+1;  
35                         }  
36                         else  
37                         {  
38                             right=mid-1;  
39                         }  
40                     }  
41                     printf("%d
",ans);  
42                 }  
43             }  
44         }  
45         return 0;  
46     }  
原文地址:https://www.cnblogs.com/YingZhixin/p/6498174.html