set:集合。
- STL的set用二叉搜索树实现,集合中的每个元素只出现一次,且是排好序的。
- 访问元素的时间复杂度是O(logn)的。
- set和map在竞赛题中应用很广泛。特别是需要用二叉搜索树处理数据的题目,
- 如果用set或map实现,能极大地简化代码。
set的有关操作:
|
例子 |
说明 |
|
set<Type> A; |
定义 |
|
A. insert(item); |
把item放进set |
|
A.erase(item); |
删除元素item |
|
A.clear(); |
清空set |
|
A.empty (); |
判断是否为空 |
|
A.size(); |
返回元素个数 |
|
A.find(k); |
返回一个迭代器,指向键值k |
|
A.lower_bound(k); |
返回一个迭代器,指向键值不小于k的第一个元素 |
|
A.upper_bound(); |
返回一个迭代器,指向键值大于k的第一个元素 |
例题:hdu 2094 产生冠军
- 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛。
- 球赛的规则如下: 如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C。
- 如果A打败了B,B又打败了C,而且,C又打败了A,那么A、B、C三者都不可能成为冠军。
- 根据这个规则,无需循环较量,或许就能确定冠军。
- 你的任务就是面对一群比赛选手,在经过了若干场撕杀之后,确定是否已经实际上产生了冠军。
#include<bits/stdc++.h>
using namespace std;
int main()
{
set<string> A, B; //定义集合
string s1, s2;
int n;
while(cin >> n && n)
{
for(int i=0; i<n; i++)
{
cin >> s1 >> s2;
A.insert(s1);
A.insert(s2); //所有人放进集合A
B.insert(s2); //失败者放进集合B
}
if(A.size() - B.size() == 1)
cout << "Yes" << endl;
else
cout << "No" << endl;
A.clear();
B.clear();
}
return 0;
}

博客介绍了STL中的set,它用二叉搜索树实现,元素唯一且有序,访问复杂度为O(logn),在竞赛题中应用广泛,能简化需用二叉搜索树处理数据的题目代码。还给出hdu 2094产生冠军的例题,说明如何根据比赛规则确定是否产生冠军。
2026

被折叠的 条评论
为什么被折叠?



