文章目录
一.知识点漏洞
1.1.DP
1.1.1.区间DP
注意注意,数据范围一定不能超过 500 500 500,外层循环枚举长度len,内层枚举左端点即可。第三层可有可无,看你怎么定义状态。
1.1.2.状压DP
1.1.3.数位DP
1.1.4.单调队列优化DP
1.1.5.斜率优化
李超树直接秒掉
化成形如 y = k x + b y=kx+b y=kx+b的结构,然后随意搞三个点出来讨论,看是应该维护上凸包还是下凸包。如果是单调的,直接用单调队列,否则建议直接李超树(注意离散化)。
1.1.6.期望DP
1.2.数据结构(非常辣鸡)
1.2.1.线段树/树状数组( O ( n log n ) O(n\log n) O(nlogn))
我更喜欢用线段树,好写也好想
适用问题:需要求区间最值或区间的和可以用,毕竟是数据结构,多用于辅助其他算法的实现,比如Dijkstra,树(树链剖分)
核心思想:懒标记
例1.2.1.CF786B Legacy 线段树优化Dijkstra
1.2.2.主席树(可持久化线段树)( O ( n log n ) O(n\log n) O(nlogn))
适用问题:查找区间第k小(大)问题
核心思想:空间换时间,建 n n n颗线段树,把两两线段树之间有关系的点连起来,然后前缀和思想就行了。
1.2.3.Tire树+可持久化Tire树( O ( n log n ) O(n\log n) O(nlogn))
适用问题:查找前缀出现的次数、某字符串的排名等
核心思想:一条树上路径就代表一个字符串,十分简单
可持久化Tire树其实就是Tire树+主席树,可以直接打,但我喜欢先用Tire求出字符串的排名,再用主席树。
例.1.2.3.牛客模拟赛第五场T3:经典字符串问题
1.2.4.树链剖分
适用问题:①离线求LCA;②动态改变树上点权并要求求点权和
核心思想:轻重链剖分,最多 log n \log n logn条重链,爬这么多次即可。
例1.2.4.遥远的国度
1.2.5.平衡树(非旋Treap)
细节多,别打错了,还是FHQ_Treep好写
void split_v (int rt, int v, int &x, int &y){
if (! rt){
x = y = 0;
return ;
}
pushdown (rt);
if (tree[rt].data <= v){
x = rt;
split_v (tree[rt].r, v, tree[rt].r, y);
}
else{
y = rt;
split_v (tree[rt].l, v, x, tree[rt].l);
}
pushup (rt);
}
void split_k (int rt, int k, int &x, int &y){
if (! rt){
x = y = 0;
return 0;
}
pushdown (rt);
if (tree[tree[rt].l].siz >= k){
y = rt;
split_k (tree[rt].l, k, x, tree[rt].l);
}
else{
x = rt;
split_k (tree[rt].r, k - tree[tree[rt].l].siz - 1, tree[rt].r, y);
}
pushup (rt);
}
int merge (int x, int y){
if (! x || ! y)
return x + y;
pushdown (x), pushdown (y);
if (tree[x].value < tree[y].value){
tree[x].r = merge (tree[x].r, y);
pushup (x);
return x;
}
else{
tree[y].l = merge (x, tree[y].l);
pushup (y);
return y;
}
}
1.2.6.单调队列/单调栈(多用于优化 O ( n 2 ) O(n^2) O(n2)的算法)
适用问题:一旦满足单减或单增,又不是二分答案,均可用此优化,常用于优化DP。
核心思想:最有情况往往存在队头,先判断对头是否在范围内,将其弹出,再判断队尾会不会被当前要放入的元素淘汰,然后把当前元素放进队尾。
例1.2.6.牛客模拟赛第六场T2:艰难睡眠
1.2.7.启发式合并
1.2.8.set
带有自动排序,自动去重,删除,插入等操作,实用但常数大
例1.2.8.BalticOI 2009 Day1 T2「Candy Machine」二维偏序+set
1.3.期望
即概率的倒数,至少现在我能做出来的期望题目都是这样
1.4.二分与三分
这种算法很常见,通常二分或三分答案,比如问你满足条件p的最小的/最大的q。
1.4.1.二分 O ( log n ) O(\log n) O(logn)
适用问题:答案满足单调性。
核心思想:通常二分答案然后check