模板——补充2
模板——补充2
三分(整数三分,实数三分),Bitset,Tarjan 算法(及其变体)。
三分
三分用于单峰函数(例如二次函数)求最值等问题。
实数三分
求 calc 凹函数的最小值。
1 |
|
整数三分
1 | ll l, r;//凸函数极大值 |
Bitset
一定要注意!!!bitset 不要和整数进行运算!!!而且整数没有 bitset 存的那么大!!!
头文件
1 |
指定大小
1 | std::bitset<1000> bs; // a bitset with 1000 bits |
构造函数
bitset(): 每一位都是false.bitset(unsigned long val): 设为val的二进制形式.bitset(const string& str): 设为 \(01\) 串str.
运算符
operator []: 访问其特定的一位.operator ==/operator !=: 比较两个bitset内容是否完全一样.operator &/operator &=/operator |/operator |=/operator ^/operator ^=/operator ~: 进行按位与/或/异或/取反操作.注意:
bitset只能与bitset进行位运算,若要和整型进行位运算,要先将整型转换为bitset.operator <</operator >>/operator <<=/operator >>=: 进行二进制左移/右移.
此外,bitset 还提供了 C++ 流式 IO
的支持,这意味着你可以通过 cin/cout 进行输入输出.
成员函数
count(): 返回true的数量.size(): 返回bitset的大小.test(pos): 它和vector中的at()的作用是一样的,和[]运算符的区别就是越界检查.any(): 若存在某一位是true则返回true,否则返回false.none(): 若所有位都是false则返回true,否则返回false.all(): 若所有位都是true则返回true,否则返回false.set(): 将整个bitset设置成true.set(pos, val = true): 将某一位设置成true/false.
reset(): 将整个bitset设置成false.reset(pos): 将某一位设置成false.相当于set(pos, false).
flip(): 翻转每一位.(\(0\leftrightarrow1\),相当于异或一个全是 \(1\) 的bitset)flip(pos): 翻转某一位.
to_string(): 返回转换成的字符串表达.to_ulong(): 返回转换成的unsigned long表达(long在 NT 及 32 位 POSIX 系统下与int一样,在 64 位 POSIX 下与long long一样).to_ullong():(C++11 起)返回转换成的unsigned long long表达.
另外,libstdc++ 中有一些较为实用的内部成员函数:
_Find_first(): 返回bitset第一个true的下标,若没有true则返回bitset的大小._Find_next(pos): 返回pos后面(下标严格大于pos的位置)第一个true的下标,若pos后面没有true则返回bitset的大小.