STLバイナリ検索
オブジェクトを使用:配列
ヘッダーファイル:アルゴリズム
lower_bound()の戻り値はイテレータであり、key以上の最初の値の位置に戻ります
。関数パラメータa + 8の配列境界aは閉じたままで、右開きです。検索が失敗した後のアドレス(範囲外アドレス)
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int a[]={
1,2,3,4,5,7,8,9};
printf("%d",lower_bound(a,a+8,6)-a);
return 0;
}
出力:5
キーを10に変更すると、すべての値がキーより小さくなり、最後の位置を返します
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int a[]={
1,2,3,4,5,7,8,9};
printf("%d",lower_bound(a,a+8,10)-a);
return 0;
}
出力:8
upper_bound()関数、キー以上の最後の要素を返します
例:CF1077E
ACコード:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 7;
int a[maxn];
map<int, int> mp;
int main()
{
int n;
scanf("%d",&n);
int cnt=0,x;
for(int i=1;i<=n;i++)
{
scanf ("%d",&x);
if(!mp[x])
{
mp[x]=++cnt;
}
++a[mp[x]];
}
sort(a+1,a+cnt+1);
int sum=0;
for(int j=1;j<=n;++j)
{
int m=0;
int l=1;
for (int k=j;k<=n;k*=2)
{
int p=lower_bound(a+l,a+cnt+1,k)-a;
if(p==cnt+1)
break;
m+=k;
l=p+1;
}
sum=max(sum,m);
}
printf ("%d\n",sum);
return 0;
}