[模拟][NOIP2007] 统计数字

NOIP2007 统计数字

时间限制: 1 Sec 内存限制: 128 MB

题目描述

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

输入

  • 第一行是整数n,表示自然数的个数;
    第2~n+1每行一个自然数。

输出

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

样例输入

  • 8
    2
    4
    2
    4
    5
    100
    2
    100

样例输出

  • 2 3
    4 2
    5 1
    100 2

提示

  • 40%的数据满足:1<=n<=1000
    80%的数据满足:1<=n<=50000
    100%的数据满足:1<=n<=200000,每个数均不超过1500 000 000(1.5*109)
var
 w:array[1..200000]of longint;
 i,j:longint;
 a,n,sum,ci:longint;
procedure sort(l,r: longint);
var i,j,x,y,c: longint;
begin
 i:=l; j:=r; x:=w[(l+r) div 2];
 repeat
  while w[i]<x do inc(i);
  while x<w[j] do dec(j);
  if not(i>j)
  then
   begin
    c:=w[i]; w[i]:=w[j]; w[j]:=c;
    inc(i); dec(j);
   end;
 until i>j;
 if l<j then sort(l,j);
 if i<r then sort(i,r);
end;
begin
 readln(n);
 for i:=1 to n do
  readln(w[i]);
 sort(1,n);
 ci:=1;
 while ci<=n do
  begin
   sum:=0;
   for j:=ci to n do
    begin
     if w[j]=w[ci]
     then inc(sum)
     else break;
    end;
   writeln(w[ci],' ',sum);
   inc(ci,sum);
  end;
end.

你可能感兴趣的:([模拟][NOIP2007] 统计数字)