题解:P11266 【模板】完全体·堆

lailai0916

2024-11-15 19:31:20

Solution

原题链接

参考资料

解题思路

说明

本题使用 GNU PBDS(Policy-Based Data Structures)可以非常优雅地解决。

__gnu_pbds::priority_queue 相比标准库的 std::priority_queue 提供了更灵活的修改和删除操作。

函数

实现

初始时,对于每个数 a_i,压入堆 q_i,并记录其迭代器位置 it_i

对于每次操作:

代码非常简洁,缺点是常数较大。

参考代码

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

const int N=1000005;
__gnu_pbds::priority_queue<int,greater<int>> q[N];
__gnu_pbds::priority_queue<int,greater<int>>::point_iterator it[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        it[i]=q[i].push(x);
    }
    while(m--)
    {
        int op,x,y,z;
        cin>>op;
        if(op==0)
        {
            cin>>x>>y;
            q[x].erase(it[y]);
        }
        else if(op==1)
        {
            cin>>x;
            cout<<q[x].top()<<'\n';
        }
        else if(op==2)
        {
            cin>>x>>y;
            q[x].join(q[y]);
        }
        else if(op==3)
        {
            cin>>x>>y>>z;
            q[x].modify(it[y],z);
        }
    }
    return 0;
}