平板电视(pb_ds)

· · 算法·理论

pb_ds

前置代码:

#include<bits/extc++.h>
using namespace std;
using namespace __gnu_pbds;

需要小熊猫c++.

堆(priority_queue)

用法和STL中的优先队列差不多\ 定义方式:__gnu_pbds::priority_queue<int,greater<int>> pq[1000010];

成员函数

你需要维护序列 a_{1,\dots,n} 以及 n 个集合 S_{1,\dots,n},初始时 S_i=\{i\}

接下来要进行以下四种操作共 m 次,每次操作形如:

不难发现这是一道堆的模板题,所以现在请你完成它。

代码:

#include<bits/stdc++.h>
#include<bits/extc++.h>
using namespace std;
using namespace __gnu_pbds;
__gnu_pbds::priority_queue<int,greater<int>> pq[1000010];
__gnu_pbds::priority_queue<int,greater<int>>::point_iterator p[1000010];
int main(){
    ios::sync_with_stdio(0);cin.tie();int n,m;cin>>n>>m;
    for(int i=1,x;i<=n;++i) cin>>x,p[i]=pq[i].push(x);
    while(m--){
        int x,y,z,op;cin>>op;
        if(op==0) cin>>x>>y,pq[x].erase(p[y]);
        if(op==1) cin>>x,cout<<pq[x].top()<<"\n";
        if(op==2) cin>>x>>y,pq[x].join(pq[y]);
        if(op==3) cin>>x>>y>>z,pq[x].modify(p[y],z);
    }
}

哈希表

可以较好的解决unordered_map常数过大的问题

cc_hash_table:拉链法解决哈希冲突问题
gp_hash_table:探测法解决哈希冲突问题

和unordered_map的操作类似,find查找键值,没有count函数,[]访问键对应的值

时间复杂度O(n),比map少一个log.

平衡树

定义方式

tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> tr;

功能

例:一个数x是第cnt个要被插入平衡树的数,那么我们就可以把(x<<20)+cnt插入平衡树中。