记录编号 157431 评测结果 AAAAAAAAAA
题目名称 [NOIP 2006]明明的随机数 最终得分 100
用户昵称 Gravatar清羽 是否通过 通过
代码语言 C++ 运行时间 0.015 s
提交时间 2015-04-08 21:23:12 内存使用 0.28 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

struct Node{
	Node* ch[2];
	int r,v,s;
	
	void Maintain(){
		s=ch[0]->s+ch[1]->s+1;	
	}
	int cmp(int x) const{
		if(x==v) return -1;
		else return x<v?0:1;
	}
};

Node *null,*root;

void rotate(Node* &o,int d){
	Node* k=o->ch[d^1];
	o->ch[d^1]=k->ch[d];
	k->ch[d]=o;
	o->Maintain();
	k->Maintain();
	o=k;
}

void insert(Node* &o,int x)
{
	if(o==null){
		o=new Node();o->ch[0]=o->ch[1]=null;o->r=rand();o->v=x;
		o->Maintain();
	}
	else{
		int d=o->cmp(x);
		insert(o->ch[d],x);
		o->Maintain();
		if(o->ch[d]->r > o->r) rotate(o,d^1);
	}
}

bool find(Node* u,int x)
{
	if(u==null) return false;
	int d=u->cmp(x);
	if(d==-1 || find(u->ch[d],x)) return true;
	return false;
}

void print(Node* o)
{
	if(o==null) return;
	print(o->ch[0]);
	printf("%d ",o->v);
	print(o->ch[1]);
}

void init()
{
	null=new Node();
	null->r=null->v=0;
	root=null;
}

void work()
{
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		int x;
		scanf("%d",&x);
		if(!find(root,x)) insert(root,x);
	}
	printf("%d\n",root->s);
	print(root);
}

int main()
{
	freopen("random.in","r",stdin);
	freopen("random.out","w",stdout);
	init();
	work();
	fclose(stdin);
	fclose(stdout);
	return 0;
}