P1097 [NOIP 2007 提高组] 统计数字
题目描述
某次科研调查时得到了 nnn 个自然数,每个数均不超过 1.5×1091.5 \times 10^91.5×109。已知不相同的数不超过 10410^4104 个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。
输入格式
共 n+1n+1n+1 行。
第一行是整数 nnn,表示自然数的个数;
第 222 至 n+1n+1n+1 每行一个自然数。
输出格式
共 mmm 行(mmm 为 nnn 个自然数中不相同数的个数),按照自然数从小到大的顺序输出。
每行输出 222 个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。
输入输出样例 #1
输入 #1
8
2
4
2
4
5
100
2
100
输出 #1
2 3
4 2
5 1
100 2
说明/提示
- 30%30\%30% 的数据满足:1≤n≤10001 \le n \le 10001≤n≤1000;
- 60%60\%60% 的数据满足:1≤n≤500001 \le n \le 500001≤n≤50000;
- 100%100\%100% 的数据满足:1≤n≤2000001 \le n \le 2000001≤n≤200000,每个数均不超过 1.5×1091.5 \times 10^91.5×109。
NOIP 2007 提高第一题
题解
#include "bits/stdc++.h"
using namespace std;
const int N = 1e5+3;
int n, a, ans = 1;
priority_queue<int, vector<int>, greater<int>>s;
struct Node{
int idx, ans;
};
int main(){
cin>>n;
for(int i=1;i<=n;++i){
cin>>a;
s.push(a);
}
while(!s.empty()){
int x = s.top();
s.pop();
if(s.empty()){
cout<<x<<" 1"<<endl;
return 0;
}
while(true){
if(x != s.top() || s.empty()){
cout<<x<<" "<<ans<<endl;
ans = 1;
break;
}else{
ans++;
s.pop();
}
}
}
return 0;
}