アルゴリズムコンテストのSTLの機能と使い方をUPPER_BOUND LOWER_BOUND

より多くの排他的なこの2つの関数の前に、半分のシナリオは手書きである必要会った\(しばらく(右= <左)\)

決定は、競争のアルゴリズムでは、これら2つの関数の使用方法についての記録を裏返しにします結局、一般TLEにはなりません。

実際には、Baiduの百科事典は、より明確に概説した、と

我々は仮定(値\)\、指定された値に
(\下\ _bound)\にある昇順見つけるために最初から前方により大きいが等しいか \(値\)
アッパー\ _bound(\ \ )昇順正面から見て第一および後部はより大きい )(値\ \値。

例えば:\(下\ _bound(A + 1、A + N-+ 1、K)が\。)である\(A \)配列\([1、N] \ ) バックに前方に(昇順になるように)範囲を見つけること第一以上(\ K)\値、およびポインタとして戻って。

戻り値の両方が容器シーケンスの最初の位置を壊すことなく、挿入することができる配列の元の値へのポインタであることに留意されたいです。
私たちは、ポインタ値が*考えられる値を得るために、前ブレーク機能を追加することができます。

配列の位置の値を挿入するのに約これを見た後、あなたはまだある、それの下と上二つの単語の意味を知っている必要が単調に厳密に増加し、単調厳密に増加中。

栗の場合:

    int *p1,*p2;
    int a[6]={3,5,6,6,7,9};
    p1=lower_bound(a,a+6,6);
    p2=upper_bound(a,a+6,6);
    printf("内存地址: p1 -> %d p2 -> %d\n",p1,p2);
    printf("在原序列中找到的值: p1 = %d p2 = %d\n",*p1,*p2);

次のような結果を操作します:

内存地址: p1 -> 7339512 p2 -> 7339520
在原序列中找到的值: p1 = 6 p2 = 7

私たちは、ポインタ操作を使用しない場合は書くことができます:\(下部\ _bound(A + 1、A + N-+ 1、k)を- A \)

手段は、アレイの開始メモリアドレス(メモリ・アレイが連続的である)、アレイにおける添字aの値の位置を減算することにより、ポインタのアドレスを検索します。

    int p1,p2;
    int a[6]={3,5,6,6,7,9};
    p1=lower_bound(a,a+6,6)-a;
    p2=upper_bound(a,a+6,6)-a;
    printf("找出的值的下标: p1 = %d p2 = %d\n",p1,p2);
    printf("找出的值: a[%d] = %d a[%d] = %d\n",p1,a[p1],p2,a[p2]);

次のような結果を操作します:

找出的值的下标: p1 = 2 p2 = 4
找出的值: a[2] = 6 a[4] = 7



我々は最初の数が単調減少列を検索したい場合はどう未満であるか、小さいものよりも値に等しいですか?

ちょうどCMP後の変更が着信する(\ _bound \低級)\または\(上部\ _bound \)関数内に、修飾配列要素内の方法を比較します。

使用法:

bool cmp(const int &a,const int &b) { return a > b; }
int *p1=lower_bound(a+1,a+n+1,k,cmp);
int *p2=upper_bound(a+1,a+n+1,k,cmp);

ここで、\(\)アレイはできない書き込みCMP構造、場合埋め込み多重定義関数のアレイであってもよいです。

つまり、単にシステムが道を知っている配列要素のこの比較を聞かせて、与えられた範囲内で、このように比較する配列がされ、\(\命じた)、あなたはこれらの関数を使用することができます。

場合\(A \)配列変数整数であり、比較関数は、ネイティブC ++(降順)を使用することができます。

\(\ _bound(+ 1、+ N + 1、値を下げる大きい<整数>())\)

おすすめ

転載: www.cnblogs.com/zhwer/p/12232910.html