treap的本质实际上就是tree+heap
用树的形式实现类似于堆得操作
中心代码就是 左旋 右旋
其中的原则就是堆顶最大
(可以用并查集+树链刨分,不过好像有点大材小用了 )
```cpp
#include<bits/stdc++.h>
using namespace std;
struct node{
int key,priority;
int left,right;
};
int SIZE=1e5;
int num_nodes,root;
node nodes[SIZE];
int rightRotate(int node_id){
//记录当前左节点
int ret=nodes[node_id].left;
//将当前节点的左节点变为左节点的右节点
nodes[node_id].left=nodes[ret].right;
//将左节点的右节点改为当前节点
nodes[ret].right=node_id;
return ret;
}
int leftRotate(int node_id){
int ret=nodes[node_id].right;
nodes[node_id].right=nodes[ret].left;
nodes[ret].left=node_id;
return ret;
}
int insert(int node_id,int key,int priority){
if(node_id==-1){
nodes[num_nodes].key=key;
nodes[num_nodes].priority=priority;
nodes[num_nodes].left=-1;
nodes[num_nodes].right=-1;
num_nodes++;
return num_nodes-1;
}
//相等忽略
if(nodes[node_id].key==key){
return node_id;
}
if(nodes[node_id].key>key){
nodes[node_id].left=insert(nodes[node_id].left,key,priority);
//小于则右旋
if(nodes[node_id].priority<nodes[nodes[node_id].left].priority){
node_id=rightRotate(node_id);
}
}else{
nodes[node_id].right=insert(nodes[node_id].right.key.priority);
//小于则左旋
if(nodes[node_id].priority<nodes[nodes[node_id].right].priority){
node_id=leftRotate(node_id);
}
}
return node_id;
}
int del(int node_id,key){
//根或叶子删除
if(num_nodes==0||node_id==-1){
return -1;
}
//小于当前向左进行
if(nodes[node_id].key>key){
nodes[node_id].left=del(nodes[node_id].left,key);
}else
if(nodes[node_id].key<key){
nodes[node_id].right=del(nodes[node_id].right,key);
}else{
return del_2(node_id,key);
}
}
int del_2(int node_id,int key){
//叶子删除
if(nodes[node_id].left==-1&&nodes[node_id].right==-1){
return -1;
}else if(ndoes[node_id].left==-1){
node_id=leftRotate(node_id);
//左子树空,左旋
}else if(nodes[node_id].right==-1){
node_id=rightRotate(node_id);
//右子树空,右旋
}else{
if(nodes[nodes[node_id].left].priority>nodes[nodes[node_id].right].priority){
node_id=rightRtotate(node_id);
}else{
node_id=leftRotate(node_id);
}
//左右非空,比较优先级
}
return del(node_id,key)
}
int main(){
return 0;
}