信息学奥赛一本通1239:统计数字,为什么我的函数被限制了,函数名也改了n遍,网上找的代码一遍过
软件:devc++ 64位 5.11
平台:信息学奥赛一本通1239:统计数字
1239:统计数字
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 14640 通过数: 6514
【题目描述】
某次科研调查时得到了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<bits/stdc++.h>
using namespace std;
int n,a[200001],x1[200001],ct,cnt=1;
void merge(int l,int r)
{
if(l>=r)
{
return;
}
int mid=(l+r)/2;
merge(l,mid);
merge(mid+1,r);
int l1=l,r1=mid+1,x2=l;
while(l1<=mid&&r1<=r)
{
if(a[l1]>a[r1])
{
x1[x2++]=a[r1++];
}
else
{
x1[x2++]=a[l1++];
}
}
while(l1<=mid)
{
x1[x2++]=a[l1++];
}
while(r1<=r)
{
x1[x2++]=a[r1++];
}
for(int i=l;i<=r;i++)
{
a[i]=x1[i];
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
merge(1,n);
ct=a[1];
for(int i=2;i<=n;i++)
{
if(a[i]!=ct)
{
cout<<ct<<" "<<cnt<<endl;
cnt=1;
ct=a[i];
}
else
{
cnt++;
}
}
cout<<ct<<" "<<cnt;
}