2159-Problem H.ly的小迷弟(二分查詢解決TLE問題)
阿新 • • 發佈:2018-12-17
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; }