您的位置:首页 > 其它

POJ 1442 Black Box (Treap)

2017-07-23 23:24 295 查看
http://poj.org/problem?id=1442

题意:每次操作插入一个数或者GET一个数,每次GET出的是第K大的数,K在每次GET后都要加一。

题解:其实完全可以不用Treap做,为了训练一下就用Treap写了。

using namespace std;
vector<int> v;
struct Treapnode
{
Treapnode *left,*right;
int value,fix;
Treapnode(int a)
{
this->value=a;
this->fix=rand();
this->left=this->right=NULL;
}
};
Treapnode *root;
void Treapleft(Treapnode *&a)
{
Treapnode *b=a->right;
a->right=b->left;
b->left=a;
a=b;
}
void Treapright(Treapnode *&a)
{
Treapnode *b=a->left;
a->left=b->right;
b->right=a;
a=b;
}
void Treapprint(Treapnode *p)
{
if(p!=NULL)
{
if(p->left!=NULL)
Treapprint(p->left);
v.pb(p->value);
if(p->right!=NULL)
Treapprint(p->right);
}
}
void Treapinsert(Treapnode *&p,int value)
{
if(p==NULL)
{
p=new Treapnode(value);
}
else
{
if(value<=p->value)
{
Treapinsert(p->left,value);
if(p->left->fix<p->fix && p->left!=NULL)
Treapright(p);
}
else
{
Treapinsert(p->right,value);
if(p->right->fix<p->fix && p->right!=NULL)
Treapleft(p);
}
}
}
int n,m,k;
int in[300010],ou[300010];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>in[i];
}
for(int i=1;i<=m;i++)
{
int x;
cin>>x;
ou[x]++;
}
for(int i=1;i<=n;i++)
{
Treapinsert(root,in[i]);
if(ou[i])
{
v.clear();
if(root!=NULL)
Treapprint(root);
for(int j=0;j<ou[i];j++)
{
cout<<v[k]<<endl;
k++;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj