专题相关技巧
线段树分治
将插入和删除操作转化成插入和末端删除,从而使删除变为撤销。
最小生成树
性质:
1.边权为 \(w\) 的边数在不同生成树中数量一定。
2.边权 \(\le w\) 的边所构成的联通信息在不同生成树中一定。
最短路
\(dij\) 去掉堆优化后时间复杂度为 \(O(n^2+m)\) ,在完全图下可以少带一个 \(log\) 。
博弈
可以先写一个暴力,然后加一些不是很能证明的剪枝或是特性,如果能过对拍,就是对的了(jly说的)。
并查集
离线区间可并信息查询
如区间 \(min\) ,扫描线,并查集上记录每个点到父亲的权值,路径压缩的时候 \(merge\) 一下。
凸性优化
凸性证明往往用归纳法。
哈希表
常见的哈希表可以用链表实现,对于某个 \(id\) ,用链表记录所有哈希值等于当前 \(id\) 的值,修改和查值在链表上线性查询。这个我们常称之为拉链法。
此外,还可以在同一个列表上跳,本质上就是将链表全拉平,代码会好些一些。
struct hash_map{
ull key[M];
int val[M];
int &operator[](const ull n){
int id=n%M,cnt=1;
while(key[id]&&key[id]!=n){
id=(id+cnt*cnt)%M;
cnt++;
}
key[id]=n;
return val[id];
}
};
背包
完全背包同余最短路做法
本质是存在一个 \(a_1\) 可以选任意个,那么对于某个已经可达的 \(B\) ,有 \(B+a_1k\) 均可达。建立最短路模型, \(dis_i\) 表示对于 \(j=i+a_1k\) 中可达的最小 \(j\)。
删除元素
对于不存在最优性(取 \(max,min\) )的背包,可以用 \(O(V)\) 的复杂度删除一个元素的贡献。注意到背包可以视作多个少项式的卷积,删除一个元素的本质就是删去一个少项式,也就是多项式除法,这显然是可做的。

浙公网安备 33010602011771号