【題目描述】某次科研調查時得到了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,每個數均不超過1500000000(1.5×109)。 本題目禁止使用STL及包含可以使用的相關調用。 |
注意: 提示和題目不一樣,開大數組
#include <iostream>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const int idata=1e5+5;
ll minn=inf,maxx=-inf;
ll n,ans,t,k;
char *ch;
ll step[200000+5];
ll temp[200000+5];
ll cnt,len;
ll query,judge,flag;
void merge_sort(int l,int r)
{
if(l==r) return;
int mid=(l+r)/2;
merge_sort(l,mid);
merge_sort(mid+1,r);
int i=l,j=mid+1,point=l;
while(i<=mid&&j<=r)
{
if(step[i]<step[j])
temp[point++]=step[i++];
else
temp[point++]=step[j++];
}
while(i<=mid)
temp[point++]=step[i++];
while(j<=r)
temp[point++]=step[j++];
for(int i=l;i<=r;i++)
step[i]=temp[i];
}
int main()
{
while(cin>>n)
{
for(int i=1;i<=n;i++)
cin>>step[i];
merge_sort(1,n);
cnt=1;
for(int i=1;i<=n;i++)
{
if(step[i]==step[i+1])
cnt++;
else
{
cout<<step[i]<<" "<<cnt<<endl;
cnt=1;
}
}
}
return 0;
}