您的位置:首页 > 理论基础 > 数据结构算法

【水题】统计数字

2015-08-23 11:31 615 查看
【题目描述】

某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。

【输入格式】

输入文件包含n+1行: 

第1行是整数n,表示自然数的个数。 

第2~n+1行每行一个自然数。

【输出格式】

输出文件包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。

【样例输入】













100 



100 

【样例输出】

2 3 

4 2 

5 1 

100 2 

【分析】

用这个顺便练习了一下treap,水题就用来巩固一下吧
#include<cstdio>
#include<ctime>
#include<cstdlib>
#define N 100005
using namespace std;
int ls
,rs
,key
,siz
,co
,ra
,root,len;
int n;

void push(int x)
{
siz[x]=siz[ls[x]]+siz[rs[x]]+co[x];
}

void rturn(int &k)
{
int t=ls[k];
ls[k]=rs[t];
rs[t]=k;
push(k);
k=t;
push(k);
}

void lturn(int &k)
{
int t=rs[k];
rs[k]=ls[t];
ls[t]=k;
push(k);
k=t;
push(k);
}

void ins(int &k,int val)
{
if (!k)
{
int t=++len;
key[t]=val;
co[t]=1;
siz[t]=1;
ra[t]=rand();
k=t;
return;
}
if (key[k]==val)
{
co[k]++;
siz[k]++;
return;
}
if (key[k]<val)
{
ins(rs[k],val);
if (ra[k]>ra[rs[k]]) lturn(k);
}
else
{
ins(ls[k],val);
if (ra[k]>ra[ls[k]]) rturn(k);
}
}

void writel(int k)
{
if (!k) return;
writel(ls[k]);
printf("%d %d\n",key[k],co[k]);
writel(rs[k]);
}

int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
ins(root,x);
}
writel(root);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息