本文主要是介绍【bzoj2761】【JLOI2011】【不重复数字】【平衡树】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Description
Input
Output
Sample Input
11
1 2 18 3 3 19 2 3 6 5 4
6
1 2 3 4 5 6
Sample Output
1 2 3 4 5 6
HINT
对于30%的数据,1 <= N <= 100,给出的数不大于100,均为非负整数;
对于50%的数据,1 <= N <= 10000,给出的数不大于10000,均为非负整数;
对于100%的数据,1 <= N <= 50000,给出的数在32位有符号整数范围内。
提示:
由于数据量很大,使用C++的同学请使用scanf和printf来进行输入输出操作,以免浪费不必要的时间。
题解:裸平衡树。
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int n,t,x;
bool f;
struct Node{Node*ch[2];int r,s,v;Node(int v):v(v){ch[0]=ch[1]=NULL;r=rand();}int cmp(int x){if (x==v) return -1;else return (x<v?0:1);}
};
Node* root;
void rotata(Node* &o,int d)
{Node*k=o->ch[d^1];o->ch[d^1]=k->ch[d];k->ch[d]=o;o=k;
}
void insert(Node* &o,int x)
{if (o==NULL) o=new Node(x);else{int d=o->cmp(x);if (d==-1) {f=false;return;}if (d!=-1){insert(o->ch[d],x);if (o->ch[d]->r>o->r) rotata(o,d^1); }}
}
int main()
{scanf("%d",&t); while(t--){ root=NULL;scanf("%d%d",&n,&x);f=true;insert(root,x);if (f) printf("%d",x); for (int i=1;i<n;i++){f=true;scanf("%d",&x);insert(root,x);if (f) printf(" %d",x); }printf("\n");}
}
这篇关于【bzoj2761】【JLOI2011】【不重复数字】【平衡树】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!