ext 庫在 OI 中的應用

彬彬冰激凌發表於2024-04-14

ext 庫在 OI 中的應用

寫一個帖子,防止以後忘了。

pb_ds 部分

pb_ds 萬能頭

#include<bits/extc++.h>

來包含 ext 庫中所有的標頭檔案(例如 pb_ds 和 rope)。

但是這句話在非 Ubuntu 環境下可能會顯示缺失 iconv.h。 這個在 OI 是可以使用的,因為評測機的 NOI-linux2.0 是 Ubuntu 環境,但如果你考試不開虛擬機器是不可以在 Windows 下執行的。

優先佇列

由於常數的優劣性,本文只介紹 pairing_heap_tag 配對堆。

然而定義卻比較複雜。

示例定義:

#include<bits/stdc++.h>
#include <ext/pb_ds/priority_queue.hpp>
using namespace std;
using namespace __gnu_pbds;

__gnu_pbds::priority_queue<int,greater<int>> a,c;//定義型別
__gnu_pbds::priority_queue<int> d;//預設大根堆

__gnu_pbds::priority_queue<int>::point_iterator it;//定義指標

struct node
{
    int x,y;
    bool friend operator <(const node a,const node b)
    {
        return a.x+a.y<b.x+b.y;
    }
};
__gnu_pbds::priority_queue<node> b;

int main()
{
    a.push(1),a.push(2),a.push(3);
    cout<<a.top()<<"\n";//輸出 1

    c.join(a);
    cout<<a.size()<<"\n";//輸出 0
    cout<<c.size()<<"\n";//輸出 3
    cout<<c.top()<<"\n";//輸出 1

    c.pop();
    cout<<c.top()<<"\n";//輸出 2

    d.push(1),it=d.push(2),d.push(3);
    cout<<d.top()<<"\n";//輸出 3

    d.modify(it,10);
    cout<<d.top()<<"\n";//輸出 10

    b.push({1,1}),b.push({2,2}),b.push({3,3});
    cout<<b.top().x<<"\n";//輸出 3
}

可以完全替代普通左偏樹。

平衡樹

失效保證(invalidation_guarantee)

pb_ds 提供了三種失效保證(不是所有的容器的有三種),分別是:

basic_invalidation_guarantee - 基本失效保證,最弱的無效保證。可以保證在容器沒有修改時候迭代器,指標等保持有效。

Ps:沒有修改的情況下,指標所指的元素還是原來的元素。

point_invalidation_guarantee - 點失效保證,更強的無效保證。可以保證在修改容器但迭代器等所指的東西沒有被刪除是保持有效。

Ps:修改後,如果修改的不是指標所指的元素,那麼指標所指的元素還是原來的元素。

range_invalidation_guarantee - 範圍失效保證,最強的無效保證。在 點失效保證 的基礎上,保證相對位置不變。

Ps:修改後,如果修改的不是指標所指的元素,那麼指標所指的元素還是原來的元素;同時,保證指標的相對位置不變。

pairing_heap_tag 均為點失效保證。

rb_tree_tag 為範圍失效保證。

其他

ROPE

參考文獻

堆 - OI Wiki

平衡樹 - OI Wiki

淺談 pb_ds 庫及其在 OI/其他算競中的應用

鴿一下……

相關文章