本题实现的是treap的结构,从key的角度来看是一个BST,从priority的角度来讲是一个heap,如果用treap的定义,每次插入进行旋转,这道题会超时,因此先针对key进行排序,排序好之后再按照顺序插入到treap中。
这里一个小技巧是,将treap[0]的位置的priority置为INT_MAX,这样保证无论treap结构如何变化,根节点总是treap[0]的右孩子,防止根节点变化带来的麻烦
#include <iostream>
#include <cstdio>
#include <limits.h>
#include <algorithm>
#include <cstring>
using namespace std;
#define maxn 150
#define maxl 50050
struct node{
char str[maxn];
int pa,ls,rs;
int pri;
};
bool operator <(node a, node b){
return strcmp(a.str,b.str)<0;
}
node treap[maxl]={0};
void insert(int i){
int j = i-1;
while(treap[j].pri < treap[i].pri){
j = treap[j].pa;
}
treap[i].ls = treap[j].rs;
treap[j].rs = i;
treap[i].pa = j;
}
void dscan(int k){
if(!k)
return;
printf("(");
dscan(treap[k].ls);
printf("%s/%d",treap[k].str,treap[k].pri);
dscan(treap[k].rs);
printf(")");
}
int main(){
int n;
while(scanf("%d",&n)){
if(!n)
break;
getchar();
memset(treap,0,sizeof(treap));
for(int i=1;i<=n;++i){
cin.getline(treap[i].str,maxn,'/');
scanf("%d",&treap[i].pri);
getchar();
}
treap[0].pri = INT_MAX;
sort(treap+1,treap+n+1);
for(int i=1;i<=n;++i){
insert(i);
}
dscan(treap[0].rs);
printf("\n");
}
return 0;
}