小知识
one
a&b + a|b = a + b;
(a&b) << 1 + (a^b) = a + b;
two
set的插入以及删除
set<int> s;
s.insert(x); // 插入x
s.erase(s.find(x));//假设我们要删除s中的x ,这里是删除迭代器
s.erase(x); // 也可以直接删除
for(int x: s) cout << x << endl; // 遍历 set
set遍历删除的时候会出问题,最好避免这种写法
这里推荐一种写法 CF1753-C
// 这里 u = 0 要换成最小值
for(int u = 0; s.upper_bound(u) != s.end(); ) {
u = *s.upper_bound(u);
s.erase(u);
}
three
multiset 包含重复元素的set
multiset<int> s;
s.insert(5);
cout << s.count(x); // 返回 s 中 x 的个数
s.erase(s.find(x)); //删除 s 中的一个 x
s.erase(x); //删除 s 中的全部 x, 有返回值 x 的个数
s.erase(posa, posb); //删除迭代器posa - posb 之间的数字
s.clear(); // 清空 s
一道STL题目
LC2034
map+堆 以及 multiset + map 第二种写法LC双百