模板 - 部分C++库
__builtin系列
据说是GCC自带的系列,在本地装有 GNU GCC Compiler 的 Codeblocks 和 Codeforces 等平台都可以使用这些。但是没办法从 Codeblocks 中找到函数原型。不过基本上区域赛都是会使用 GCC 的吧。
__builtin_popcount(unsigned int n):返回n的二进制1的个数,输入其他类型会强制转换成 unsigned int 再计算。
__builtin_parity(unsigned int n):返回n的二进制1的个数的奇偶性,没什么用。
__builtin_ffs(unsigned int n):返回n的二进制的最后一个1的位置,从右往左数从1开始,返回0表示没有1。貌似都是强转成 unsigned int 了。
__builtin_ctz(unsigned int n):返回n的末尾0的数量,相当于上一个函数-1,返回32表示全都是0。貌似都是强转成 unsigned int 了。
__builtin_clz (unsigned int n):返回n的前导0的数量。当全是0的时候好像会出乱码。
所以还是没事别用后面的那几个了。
其他
nth_element(a + 1, a + k, a + 1 + n):假如a[1],...a[n]恰好是[1,n]的一个排列,那么调用前面的形式,就会使得a[k]==k成立。换言之就是把前k小放在a[1,k]中。期望复杂度O(n)。算法的大概过程:选择一个pivot,通过快速排序的partition函数把小于pivot的放在左边,把大于pivot的放在右边,复杂度O(n)。这时假如pivot恰好在第k个位置,则直接返回。否则数组被pivot分成了两半,若左半边包含第k个位置,则向左递归;右半边同理。