快排模板2020-7-3

    技术2023-11-12  104

    问题 M: 【排序】统计数字――快速排序

    时间限制: 1 Sec  内存限制: 64 MB提交 状态

    题目描述

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

    输入

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

    输出

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

    样例输入 Copy

    8 2 4 2 4 5 100 2 100

    样例输出 Copy

    2 3 4 2 5 1 100 2

    提示

    40%的数据满足:1≤n≤1000; 80%的数据满足:1≤n≤50000, 100%的数据满足:1≤n≤200000,每个数均不超过1.5×109。

     

    #pragma GCC optimize(1) #pragma GCC optimize(2) #pragma GCC optimize(3,"Ofast","inline") #include <iostream> #include <bits/stdc++.h> using namespace std; typedef long double ll; int a[200005]; void quick_sort(int start,int last) { int i=start; int j=last; int temp=a[i];/// if(i<j) { while(i<j) { while(i<j&&a[j]>=temp) j--; if(i<j)///a[j]<temp { a[i]=a[j];///temp存a[i] i++; } while(i<j&&temp>a[i]) i++; if(i<j) { a[j]=a[i]; j--; } } a[i]=temp; quick_sort(start,i-1); quick_sort(i+1,last); } } int main() { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } quick_sort(1,n); int cnt=1; //for(int i=1;i<=n;i++) // printf("%d ",a[i]); // puts(""); for(int i=2;i<=n+1;i++) { if(a[i]==a[i-1]&&i>1) { cnt++; } else { printf("%d %d\n",a[i-1],cnt); cnt=1; } } // printf("%d",a[n],cnt); return 0; }

     

    Processed: 0.017, SQL: 9