

unordered_map(无序映射/哈希表)
unordered_map<int, int> b_n
-
用途:记录每个人被提及的次数
-
底层实现:哈希表
-
时间复杂度:平均 O(1) 的插入、查找
-
相关操作:
b_n[b]++:自动创建键值对并递增
unordered_map<int, set<int>> b_a
-
用途:记录谁被谁提及(被提及者 -> 提及者的集合)
-
嵌套容器 :值类型是
set<int> -
相关操作:
b_a[b].insert(a):向集合中插入元素
set(有序集合)
cpp
unordered_map<int, set<int>> b_a;
// ^^^^^^^^
// 红黑树实现,元素自动排序且去重
-
底层实现:红黑树(平衡二叉搜索树)
-
特点:
-
元素自动按升序排列
-
不允许重复元素
-
插入、删除、查找:O(log n)
-
基于范围的 for 循环(Range-based for loop)
cpp
for(const auto& p : b_n) { // C++11 特性
if(p.second > m) {
m = p.second;
ans = p.first;
}
}
-
auto:自动类型推导,p 的实际类型是pair<const int, int> -
const auto&:const 引用,避免拷贝 -
p.first:被提及者的编号 -
p.second:被提及的次数
cpp
for(int t : b_a[ans]) // 遍历 set 中的元素(自动升序)
cout << t << ' ';
std::pair 的使用
在遍历 unordered_map 时,p 是 pair 类型:
cpp
p.first // 键(key)
p.second // 值(value)
STL 容器的综合应用
bash
p.first // 键(key)
p.second // 值(value)
AC代码:
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
int N;
cin >> N;
unordered_map<int,int>b_n;//被提及的人与次数
unordered_map<int,set<int>>b_a;//记录谁被谁提及
while(N--){
int a,k;
cin >> a >> k;
while(k--){
int b;
cin >> b;
b_n[b]++;
b_a[b].insert(a);//set自动排序去重
}
}
int m = -1,ans = -1;
for(const auto&p : b_n){//找出被提及次数最多的人
if(p.second > m){
m = p.second;
ans = p.first;
}
}
cout << ans << endl;
for(int t : b_a[ans]) cout << t << ' ';
return 0;
}