统计数字

题目背景

警告:数据可能存在加强

题目描述

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

输入输出格式

输入格式:

 

共n+1n+1行。

第一行是整数nn,表示自然数的个数;

第22至n+1n+1每行一个自然数。

 

输出格式:

 

共mm行(mm为nn个自然数中不相同数的个数),按照自然数从小到大的顺序输出。

每行输出22个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。

 

输入输出样例

输入样例#1: 复制

8
2
4
2
4
5
100
2
100

输出样例#1: 复制

2 3
4 2
5 1
100 2

说明

40\%40%的数据满足:1 \le n \le 10001≤n≤1000

80\%80%的数据满足:1 \le n \le 500001≤n≤50000

100\%100%的数据满足:1 \le n \le 2000001≤n≤200000,每个数均不超过1500 000 000(1.5 \times 109)1500000000(1.5×109)

 

哈希。。。。差不多模版

// luogu-judger-enable-o2
// luogu-judger-enable-o2
#include
#include
#include
#include
#include

using namespace std;

long long n,a[200001][4]={0},p=14993,b[200001]={0};


int dw(long long x)
{
    int w=x%p;
    int i=0;
    while (i     i++;
    return (w+i)%p;
}

int  main()
{
    cin>>n;
    for (int i=1;i<=n;i++)
    {
       long long x;
       cin>>x;
       int po=dw(x);
       if (a[po][1]==x) a[po][2]++;
       else a[po][1]=x;
       b[i]=x;
    }
    
    sort(b+1,b+n+1);
    
    long long last=0;
    for (int i=1;i<=n;i++)
    {
        int po=dw(b[i]);
        if (last!=b[i])    cout<         last=b[i];
    }

}

你可能感兴趣的:(c++,水题)