仅用做提醒自己,看不懂概不负责~
LIS 和 LNDS #
Maximum subarray sum #
整数三分 #
以求函数最大值为例
把 n 分成 k 组 #
int sz = n / k
有n % k
组有sz + 1
个,k - n % k
组有sz
个。
快速范围判断 #
判断是否在[0, N),常用于 bfs/dfs 边界判断
判断是否在 [l, r]内
根据两数之和和异或值反推两数 #
原理:a + b == (a ^ b) + 2 * (a & b)
如果sum−xor是奇数,那么无解。
否则A=(sum−xor)/2,根据 A 和 xor 的每一位填就行了,注意如果某一位两数都是 1 的话也是无解。
优先队列模板参数自动推断 #
利用了类模板实参推导(CTAD),可以少写一点代码,需要 C++17。
g++11 有 bug,要写成
精确计算⌈log2x⌉ #
用交换相邻元素的排序数组的最小操作次数 #
是数组中逆序对的数目
a 个 0,b 个 1 组成的 01 字符串字典序第 k 小 #
先预处理 i 个 0,j 个 1 的字符串个数,然后从高位到底位枚举
位运算技巧 #
可以看这
冒泡排序遍历的次数 #
创建一个复制数组 b,其中b[i]=a[i],i,然后排序 b,排序后b[i].second−i的最大值就是答案,b[i].second−i本质上就是一个数向前移动的距离,不难想出每个会向前移动的数从第一轮遍历就会开始向前移动,直到到达排序后的位置,所以最大的向前移动距离就是遍历的轮数。