1. 程式人生 > >2159-Problem H.ly的小迷弟(二分查詢解決TLE問題)

2159-Problem H.ly的小迷弟(二分查詢解決TLE問題)

Problem H: H.ly的小迷弟

Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 168  Solved: 62 [Submit][Status][Web Board]

Description

眾所周知ly雖然是個小胖子,但是長得還是很好看的,所以她有很多小迷弟(bu cun zai de),但是ly當然不是個只看顏值的人了,所以在她覺得顏值還可以的所有人裡,把這些人選出來按照智商排序... 雖然wjw不是ly的小迷弟,但是wjw很想知道某個智商值在這群人裡能排多少名,那麼只能麻煩你幫他了

Input

第一行一個整數N表示有N個被選出來的小迷弟 第二行N個整數分別表示這N個小迷弟的智商 接下來若干行表示wjw的詢問,每行一個智商值

Output

每行一個整數表示答案

Sample Input

5 1 2 3 4 5 1 2 3 4 5

Sample Output

1 2 3 4 5

HINT

0<=智商<=2^31-1 0<=N<=1000000

今天我簡直是太笨了...記錯了lower_bound ,upper_bound中的等號!! (小本本上抄十遍)

(有等號有等號有等號!!)lower_bound( begin,end,num):從陣列的begin位置到end-1位置二分查詢第一個大於或等於num的數字,找到返回該數字的地址,不存在則返回end。通過返回的地址減去起始地址begin,得到找到數字在陣列中的下標。

upper_bound( begin,end,num):從陣列的begin位置到end-1位置二分查詢第一個大於num的數字,找到返回該數字的地址,不存在則返回end。通過返回的地址減去起始地址begin,得到找到數字在陣列中的下標。  

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#define go(i,a,b) for(int i=a;i<=b;i++)
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
const int maxn = 1e6 + 5;
typedef long long ll;
ll a[maxn];
int main()
{
    int t,x;
    scanf("%d",&t);
    go(i,0,t-1) scanf("%lld",&a[i]);
    sort(a,a+t);
    while(scanf("%d",&x) != EOF)
    {
        cout<< lower_bound(a, a+t, x)-a+1<<endl;
    }
    return 0;
}