题目大意:
一棵binary tree是内部节点都有一个标签和一个优先级,是关于标签和优先级的一棵二叉查找树,叫做treap。你的任务是,给定一个标签-优先级对,都是唯一的,构造一个treap。
解题思路:
构造笛卡尔树
代码如下:
#include<cstdio>
#include<cstring>
#include<cassert>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<vector>
using namespace std;
typedef pair<string, int> psi;
typedef vector<psi> vpsi;
struct Node{
Node *child[2],*parent;
string key;
int fix;
Node(string _key,int _fix)
{
child[0]=child[1]=parent=NULL;
key=_key;
fix=_fix;
}
};
struct Cartesian
{
Node *root,*back;
Cartesian()
{
root=back=NULL;
}
void rotate(Node *rt,bool left)
{
bool right=!left;
Node *p=rt->child[right];
p->parent=rt->parent;
if(p->child[left])
p->child[left]->parent=rt;
rt->child[right]=p->child[left];
rt->parent=p->child[left];
p->child[left]=rt;
}
void pushBack(Node *x)
{
Node *p=back;
while(p&&p->fix<x->fix)
p=p->parent;
if(p)
{
if(p->child[false])
p->child[false]->parent=x;
x->child[true]=p->child[false];
x->parent=p;
p->child[false]=x;
}
else
{
if(root) root->parent=x;
x->child[true]=root;
root=x;
}
back=x;
}
void print(Node *T)
{
if(!T) return;
putchar('(');
print(T->child[true]);
printf("%s/%d",T->key.c_str(),T->fix);
print(T->child[false]);
putchar(')');
}
}cart;
void deal(int n)
{
cart=Cartesian();
char buf[100];
vpsi tmp;
while(n--)
{
scanf("%s",buf);
int p=0,key;
while(buf[p]!='/') p++;
buf[p]=0;
sscanf(&buf[p+1],"%d",&key);
tmp.push_back(make_pair(buf,key));
}
sort(tmp.begin(),tmp.end());
int size=tmp.size();
for(int i=0;i<size;i++)
{
Node *temp=new Node(tmp[i].first,tmp[i].second);
cart.pushBack(temp);
}
cart.print(cart.root);
puts("");
}
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
deal(n);
}
return 0;
}