POJ 1442 Black Box (Treap)
2017-07-23 23:24
295 查看
http://poj.org/problem?id=1442
题意:每次操作插入一个数或者GET一个数,每次GET出的是第K大的数,K在每次GET后都要加一。
题解:其实完全可以不用Treap做,为了训练一下就用Treap写了。
题意:每次操作插入一个数或者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 1442 Black Box【treap模板】
- POJ 1442 Black Box(Treap)
- POJ 1442 Black Box Treap 模板题
- POJ 1442 Black Box 基础Treap
- POJ 1442 Black Box(【Treap】求动态区间第k大)
- POJ-1442 Black Box,treap名次树!
- Treap模板——POJ1442——Black Box
- POJ 1442 Black Box(treap练习)
- POJ 1442 Black Box Treap
- POJ 1442 Black Box(treap)
- POJ 1442 Black Box ( Treap )
- poj 1442 Black Box (treap树入门题)
- POJ 1442 Black Box [Treap]
- POJ 1442 Black Box [treap]
- POJ 1442 Black Box treap || 树状数组 || 优先队列
- POJ 1442 Black Box treap裸题 动态求整个序列的前k大数
- POJ 1442 Black Box treap求区间第k大
- POJ 1442 Black Box(treap树指针实现)
- 【POJ 1442】Black Box (treap树)
- poj-1442 Black Box(Treap)