week4-[二维数组]平面上的点
week4-[二维数组]平面上的点
题目描述
有 NNN 个二维平面上的点,每个点的坐标都是整数且坐标范围都在 0∼9990\sim 9990∼999 之间,求其中出现最频繁的点的出现次数及其坐标。
输入格式
第一行有一个整数 NNN,表示平面上点的个数。
接下来 NNN 行,每行有两个整数,表示一个平面上的点的 x,yx,yx,y 二维坐标。
输出格式
输出的第一行为一个整数,表示平面中的点出现的最多次数。
接下来输出每行两个整数,表示出现最频繁的点的二维坐标。
- 如果有多个点均为最频繁出现的点,则输出包括多行。输出的顺序为:先按照 xxx 坐标从小到大输出,再按照 yyy 坐标从小到大输出。
样例 #1
样例输入 #1
5
1 2
3 2
2 8
1 2
6 10
样例输出 #1
2
1 2
样例 #2
样例输入 #2
7
1 5
0 3
8 2
4 2
1 5
6 7
0 3
样例输出 #2
2
0 3
1 5
样例 #3
样例输入 #3
10
5 3
5 3
5 2
2 6
5 3
2 6
5 2
2 6
1 8
5 2
样例输出 #3
3
2 6
5 2
5 3
提示
数据范围
对于所有数据,1≤n≤500001 \le n \le 500001≤n≤50000。
这题考察的是 二维点的统计与排序,重点在于:
- 统计每个点出现次数
- 找到最大出现次数
- 输出所有达到最大次数的点,按坐标排序
🔎 解题思路
- 存储与统计
- 点的坐标范围在
[0,999]
,但n
可达50000
,直接开1000×1000
数组也行(内存约 1MB),也可以用map<pair<int,int>, int>
来统计次数。 - 推荐用
map
或unordered_map
,因为题目数据范围比较大,但点可能很稀疏。
- 点的坐标范围在
- 寻找最大值
- 遍历统计结果,找到出现次数的最大值
maxCnt
。
- 遍历统计结果,找到出现次数的最大值
- 收集答案并排序
- 遍历统计表,找出所有次数等于
maxCnt
的点,放到数组里。 - 对结果按照
(x,y)
排序:先比x
,若相等再比y
。
- 遍历统计表,找出所有次数等于
📝 C++ 实现
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;int main() {int n;cin >> n;map<pair<int,int>, int> freq;for (int i = 0; i < n; i++) {int x, y;cin >> x >> y;freq[{x, y}]++;}int maxCnt = 0;for (auto &p : freq) {if (p.second > maxCnt) maxCnt = p.second;}vector<pair<int,int>> ans;for (auto &p : freq) {if (p.second == maxCnt) ans.push_back(p.first);}sort(ans.begin(), ans.end()); // pair 默认先按 first 再按 second 排序cout << maxCnt << "\n";for (auto &pt : ans) {cout << pt.first << " " << pt.second << "\n";}return 0;
}