zoukankan      html  css  js  c++  java
  • 【bzoj2761】【JLOI2011】【不反复数字】【平衡树】

    Description

    给出N个数,要求把当中反复的去掉。仅仅保留第一次出现的数。
    比如,给出的数为1 2 18 3 3 19 2 3 6 5 4。当中2和3有反复。去除后的结果为1 2 18 3 19 6 5 4。
     

    Input

    输入第一行为正整数T,表示有T组数据。

    接下来每组数据包含两行,第一行为正整数N,表示有N个数。第二行为要去重的N个正整数。
     

    Output

     
    对于每组数据,输出一行,为去重后剩下的数字,数字之间用一个空格隔开。

    Sample Input

    2
    11
    1 2 18 3 3 19 2 3 6 5 4
    6
    1 2 3 4 5 6

    Sample Output

    1 2 18 3 19 6 5 4
    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(" "); } } 




  • 相关阅读:
    px和rem换算
    使用Android Studio创建Android项目
    Hopscotch
    AtCoder Grand Contest 010 --C:Cleaning
    Hello world!
    概率生成函数
    FFT 学习笔记
    扩展中国剩余定理(excrt)
    组合恒等式
    常见数列
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7211766.html
Copyright © 2011-2022 走看看