并查集: poj1988 模拟栈合并和统计到栈底的深度
cdoj 1338 将矩阵中的数保持每行每列大小关系缩小。
主席树: poj2104 区间第k小,看卿学姐视频写(chao)了一发,不过还不会主席树
dp: cdoj1345单调队列优化(用deque模拟单调队列),看着别人博客写了一发。
骨牌铺法:hdu1992
- 第i行不放置,则前一行必须有放置的骨牌。x对应二进制位为0,y对应二进制位为1。
- 第i行竖放骨牌,则前一行必须为空。x对应二进制位为1,y对应二进制位为0。
- 第i行横向骨牌,则前一行必须两个位置均有骨牌,否则会产生空位。x对应二进制位为1,y对应二进制位为1
hdu 5735 dp 将dp式子拆分,一个不错的姿势。仅考虑and操作. 不妨令dp(s)=f(s)−wsdp(s)=f(s)-w_s
我们大概要求的就是dp(i)=maxj is ancestor of i{dp(j)+wi and wj}
. 然后, 显然dp(j)+wi and wjdp(j)+w_i\text{ and }w_j
个式子可以拆成dp(j)dp(j)
+[wiw_i
后8位] and [wjw_j
后8位] + ([wiw_i
前8位] and [wjw_j
前8位]) << 8.考虑这样一个二维数组ds(x,y)ds(x,y)
, 表示对于某个wiw_i
的后8位为yy
, 对于某个wjw_j
的前8位为xx
时,dp(j)dp(j)
+ [wiw_i
后8位] and [wjw_j
后8位]的最值.如果知道了上述数组, 那么对于某个ii
, 计算dp(i)
的值就十分方便, 不妨令wi=(a<<8)∣bw_i=(a << 8) | b
, 即aa
和bb
分别是wiw_i
前8位和后8位, 那么只需要枚举wj
的前8位xx
, 用ds(x,b)+((a and x)<<8)ds(x,b)+((a \text{ and } x) << 8)
更新dp(i)dp(i)
. 把新的dpdp
值更新到ds(x,y)ds(x,y)
也是类似的.链接:https://async.icpc-camp.org/d/493-2016-multi-university-training-contest-2
codeforces 425C C. Sereja and Two Sequences dp + 二分