【笔记】Tricks 汇总

2023.10

  • 对于一棵树上的一条链 \(u\rightarrow v\)​,求解一个点 \(x\)​ 满足它既是 \(u\)​ 的儿子,又在链上,它即是 \(v\)​ 的第 \(dep[v]-dep[u]-1\)​ 级祖先(可以用倍增 \(\log\)​ 求解

    (当然树剖也可以。

  • 书上背包问题时间复杂度实际上是 \(O(n^2)\)[JSOI2016] 最佳团体
    【?】因为每次合并一棵子树时付出的代价是 已经合并的兄弟子树的大小之和 \(\times\) 正在合并的这棵子树的大小,实质上是树上每对节点在 LCA 处贡献时间复杂度 ... 所以是 \(n^2\) 的。

  • 关于 unordered_map or unordered_set 的运算符重载:(双哈希封装常用

点击查看代码
struct Hash {
	ull x, y;
	bool operator == (const Hash& xx) const { return x == xx.x && y == xx.y; }
} P[MAXN], hs[MAXN], ht[MAXN];
struct _Hash {
    size_t operator () (const Hash& a) const {
        return hash<ull>()(a.x) * hash<ull>()(a.y);  // 这里 * 法可以任意改,求得到是最终 Hash 的值
    }
};
// 定义:
unordered_set<Hash, _Hash> se;
unordered_map<Hash, bool,  _Hash> mp;

2023.12

  • 单点修改,查询树链的和:树上差分

    单点修改 -> 子树修改:add(dfn[x]+siz[x], -val), add(dfn[x], val);

    树链的和 -> 差分:ask(dfn[u]) + ask(dfn[v]) - ask(dfn[lca(u,v)]) - ask(dfn[fa[lca(u,v)]])

  • 树链修改,单点查询:树上差分

    单点修改 -> 差分:add(dfn[u], val), add(dfn[v], val), add(dfn[lca(u, v)], -val), add(dfn[fa[lca(u, v)]], -val);

    树链的和 -> 子树修改:ask(dfn[x]+siz[x]-1) - ask(dfn[x]-1);

  • 对于互相独立的询问,可以对它排序,然后考虑每增加一个询问的变化,求解。很经典的例子:【[USACO18FEB] Snow Boots G

  • 对平均数/中位数的处理:二分 mid,\(\le\) mid 为 -1,反之为 1。【[ABC107D] Median of Medians

  • 关于推期望的小 trick

    或者,令 \(P=\sum\limits_{i\in S}p[i]\)

    \[E(\min\{S\})=\sum_{i=1}^{\infty}(1-P)^{i-1}P\times i=\frac{1}{P} \]

  • 看到分式可以考虑根号算法。【Wonderful Jump

  • 对于数对的数位 DP 可以考虑容斥,即 ans = solve(r,r) - solve(l-1,r) - solve(r,l-1) + solve(l-1,l-1)Daniel and Spring Cleaning

  • 原来以 \(1\) 为根,换为 \(x\) 为根。则 \(\text{lca}(a,b)\) 变为 \(\text{lca}(a,b)\)\(\text{lca}(a,rt)\)\(\text{lca}(rt,b)\) 三者中深度最大的点。

  • 如果带判断无解的题,可以先把无解的判完,剩下直接贪最优【Making Anti-Palindromes

  • 概率 DP,如果规模比较大,而且求的是小数,越到后面 dp 的更改值只会更小,所以可以直接跑一个较小的规模【Game with Probability Problem

  • 对于有限制的状压 DP,如果一个状态是否存在是不确定的,可以考虑反向定义状态并转移。【[SCOI2008] 奖励关


2024.1

  • 找必要条件,然后可以尝试她是否有充分性【月圆

  • 行列比配问题可以抽象成二分图。【月圆

  • \({i\choose j}\bmod 2=1\) 当且仅当 \(i \operatorname{and} j=j\)
    由 卢卡斯定理:

    \[X=\binom{n}{m}\bmod 2 = \binom{\left\lfloor n/2 \right\rfloor}{\left\lfloor m/2\right\rfloor}\times\binom{n\bmod 2}{m\bmod 2}\bmod 2 \]

    发现这其实是对 \(i,j\) 二进制分解。
    \(X=0\) 当且仅当 \(\binom{n\bmod 2}{m\bmod 2}\) 中存在 \(0\),即 \(i=0,j=0\) 时。
    Lost Array

  • 莫队指针移动,一定是先扩大再缩小。
    求区间数出现的个数的 mex,暴力求的时间复杂度为 \(O(\sqrt n)\)Machine Learning


2024.2

  • gcd 与 加法 = 更相减损。【[ABC254F] Rectangle GCD
    区间 gcd 结论:

    \[\gcd(a[l],...,a[r]) = \gcd(a[l], a[l+1]-a[l], ... , a[r]-a[r-1]) \]

  • ST 表求 lca
    求出 dfn,\(\text{lca}(u,v)\) 为从 dfn[u]dfn[v] 深度最小的点。


2024.4

  • 树上的权值线段树合并总时间复杂度是 \(O(n\log n)\)

    一共只会有 \(n\) 个点被合并,并且合并时一般不会重复地合并某个线段树,所以我们最终增加的点数大致是 \(n\log n\) 级别的。

    常用于 SAM 中维护 endpos。【[HEOI2016/TJOI2016] 字符串


2024.10

  • dp 状态如果是算所有情况的权值和 \(f\),不妨考虑一个辅助 dp:\(g(i)\) 表示权值大于等于 \(i\) 的方案数。

    那么一定有 \(f=\sum_{i=0}^{V}g(i)\),其中 \(V\) 是值域。

    这样可以转化为单纯的方案数计数的问题,可能会更好做一些。【BZOJ4770 图样(长者)


2024.11

  • 判断性的问题通常会需要一个量化的依据。一个好的依据,可能具有单调性,通过一个值来判断一类询问,然后再离线做。【「CF1997E」Level Up
  • 记录一个很典的 next_permutation 类问题(之前好像也有但是记不太到了)「NOIP2024模拟赛32 T3」Soso 的排列
posted @ 2023-10-24 22:10  CloudWings  阅读(17)  评论(0编辑  收藏  举报