| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
用这题测了自己写的Treap422MS,1A有木有。
#include<stdlib.h>
#include<queue>
#include<iostream>
#include<stdio.h>
#include<assert.h>
using namespace std;
struct Treap{
struct Node{
int key, priority;
Node *left, *right;
int size;
Node(int k,int p):key(k),priority(p),left(NULL),right(NULL),size(1){}
}* root;
Treap():root(NULL){}
void left_rotate(Node *&x){
Node* y = x->right;
x->right = y->left;
y->left = x;
update(x);
x = y;
}
int size(Node *root){
if(!root) return 0;
else return root->size;
}
void update(Node *root){
root->size = 1 + size(root->left) + size(root->right);
}
void right_rotate(Node *&y){
Node *x = y->left;
y->left = x->right;
x->right = y;
update(y);
y = x;
}
void insert(Node *&root, int key){
if(!root) {
root = new Node(key,rand());
return;
}
if(key<root->key){
insert(root->left,key);
if(root->priority>root->left->priority)
right_rotate(root);
}else{
insert(root->right,key);
if(root->priority>root->right->priority)
left_rotate(root);
}
update(root);
}
void insert(int key){
insert(root,key);
}
int select(Node *root,int k){
if(size(root->left)+1==k) return root->key;
else if(size(root->left)+1>k) return select(root->left,k);
else return select(root->right,k-size(root->left)-1);
}
int select(int k){
assert(size(root)>=k);
return select(root,k);
}
};
const int M = 30001;
const int N = 30001;
int A[M];
int cnt[M];
int n,m,u;
int main()
{
Treap treap;
int k = 0;
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
scanf("%d",A+i);
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=n;i++){
scanf("%d",&u);
cnt[u] ++;
}
for(int i=1;i<=m;i++){
treap.insert(A[i]);
while(cnt[i]--) printf("%d\n",treap.select(++k));
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator