Tricks

  • 每次删一个点,多次询问,但是方便加点不方便删点可以考虑分治模拟删点(把当前的另一半区间全加上,然后递归到子区间)。

  • 差分约束 \(=\) 转化成 \(\le and \ge\)

  • 左边 \(n\) 个点右边 \(m\) 个点的完全二分图的生成树数量是 \(n^{m-1}m^{n-1}\)

  • (树)一个连通块内点数 \(-\) 边数 \(=1\),所以总连通块数就是点数 \(-\) 边数。e.g.

  • 线段树合并时删去的点可以重新利用(garbage),在此基础上有时候可以优先遍历重儿子:reference

  • 需要多次排序但又不太关注每个数具体大小时(关注相对大小),可以二分一个 \(mid\),把 \(\ge mid\) 的设置成 \(1\)\(\le mid\) 的设置成 \(0\),借助线段树在 \(\operatorname{O}(\log n)\) 时间内完成排序。就是这个题。求中位数也可以这样。

  • (2024 一轮省集 D8T2)对于一条路径只贡献一次的问题,可以把点权设置为 \(w\),边权为 \(-w\),进行树上差分。

  • 不要无脑树剖线段树,有些问题可以树上差分做到线性或者线性对数,避免两只 \(\log\)。总结一下:

    • 单点加路径查:dfs 做根到单点的前缀和即可,查询变为 sum[u]+sum[v]-sum[lca]-sum[fa[lca]]
    • 路径加单点查:对于路径直接差分,路径两端点加,\(lca\)\(fa[lca]\) 减,查询做子树和。
    • 更进一步的有同时有链和子树的,不展开写了,大概使用到分离变量,开两个数据结构维护。reference1 and reference2
  • 算组合数的时候,一定要注意 \(n-m\) 是不是会出现负数!这个问题遇到两次了。

  • \(\sum\limits_{i=1}^n x\bmod i\) 或者干脆就是 \(\sum\limits_{i=1}^n\frac{x}{i}\) 想想整除分块啊??!

posted @ 2024-09-27 18:23  LHLeisus  阅读(97)  评论(0)    收藏  举报