COGS 74. [NOIP2006] 明明的随机数 (Splay小练习。。)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了COGS 74. [NOIP2006] 明明的随机数 (Splay小练习。。)相关的知识,希望对你有一定的参考价值。

☆   输入文件:random.in   输出文件:random.out   简单对比
时间限制:1 s   内存限制:128 MB

【问题描述】
    明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 N 个 1 到 1000 之间的随机整数( N ≤ 100 ),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按 照 排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

【输入格式】 
     输入文件 random.in 有 2 行,第 1 行为 1 个正整数,表示所生成的随机数的个数:N

     第 2 行有 N 个用空格隔开的正整数,为所产生的随机数。

【输出格式】 
     输出文件 random.out 也是 2 行,第 1 行为 1 个正整数 M ,表示不相同的随机数的个数。第 2 行为 M 个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

【输入输出样例】
 
输入: 
10
20 40 32 67 40 20 89 300 400 15

输出:
8
15 20 32 40 67 89 300 400

 

splay练习 。。

屠龙宝刀点击就送

#include <ctype.h>
#include <cstdio>
bool vis[150];
int siz[150],cnt[150],n,data[150],cn,root,tot,fa[150],ch[150][2];
void read(int &x)
{
    x=0;bool f=0;
    register char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch==-) f=1;
    for(;isdigit(ch);ch=getchar()) x=x*10+ch-0;
    x=f?(~x)+1:x;
}
inline void pushup(int rt)
{
    int l=ch[rt][0],r=ch[rt][1];
    siz[rt]=siz[l]+siz[r]+cnt[rt];
}
void ins(int &rt,int x)
{
    if(rt==0)
    {
        rt=++tot;
        data[tot]=x;
        siz[tot]=cnt[tot]=1;
        return;
    }
    if(x==data[rt])
    {
        cnt[rt]++;
        siz[rt]++;
        return;
    }
    if(x<data[rt])
    {
        ins(ch[rt][0],x);
        fa[ch[rt][0]]=rt;
        pushup(rt);
    }
    else 
    {
        ins(ch[rt][1],x);
        fa[ch[rt][1]]=rt;
        pushup(rt);
    }
}
int getkth(int rt,int k)
{
    int l=ch[rt][0];
    if(siz[l]+1<=k&&k<=siz[l]+cnt[rt]) return data[rt];
    if(k<siz[l]+1) return getkth(ch[rt][0],k);
    if(siz[l]+cnt[rt]<k) return getkth(ch[rt][1],k-(siz[l]+cnt[rt]));
}
int main()
{
    freopen("random.in","r",stdin);freopen("random.out","w",stdout);
    read(n);
    for(int a,i=1;i<=n;i++)
    {
        read(a);
        if(!vis[a])
        {
            vis[a]=1;
            cn++;
            ins(root,a);
        }
    }
    printf("%d\n",cn);
    for(int i=1;i<=cn;i++) printf("%d ",getkth(root,i));
    return 0;
}

 

以上是关于COGS 74. [NOIP2006] 明明的随机数 (Splay小练习。。)的主要内容,如果未能解决你的问题,请参考以下文章

[NOIP2006]明明的随机数

[NOIP2006]明明的随机数

LM0004 明明的随机数排序

2006明明的随机数

急求:信息学竞赛(普及组)的试卷(pascal)??

2021算法竞赛入门班第一节课枚举贪心习题