杂项 tricks

分治

题目:模拟赛题

不知道怎么想到分治的。总之不断分治,每次讨论中间跨过界限的3个点(因为一次不可能跨过超过3个点,所以一定经过了3个点中的1个)。剩下的不会。

博弈论

二分图博弈

比如这道题。可以直接分析后 \(O(1)\) 做完。

一般来说:轮流取/移动某个东西,可能和二分图博弈有关。详情见这篇博客

Nim 游戏

地上有若干堆石子,每堆都有 \(a_i\) 个。你和对手轮流取石子,每次可以从一堆中取任意多个,但不能跨堆取,也不能把石子取成负数。谁先取完最后一颗石子谁就赢了。

一个结论,如果 \(\mathrm{xor}_{i=1}^na_i=0\) 那么必输,否则必赢。

证明见知乎

二分答案

常见转化

一、答案可行性具有单调性的。
二、确定了某个数值后,可以快速判断答案可行性的。
三、复杂度需要 \(\log\) 级别的。

整体二分

一种类似 cdq 的算法,见博客“整体二分”。

分数规划

摘自OI-wiki


分数规划用来求一个分式的极值。

形象一点就是,给出 \(a_i\)\(b_i\),求一组 \(w_i\in\{0,1\}\) ,最小化或最大化 \(\displaystyle\frac{\sum\limits_{i=1}^na_i\times w_i}{\sum\limits_{i=1}^nb_i\times w_i}\)

另外一种描述:每种物品有两个权值 a 和 b,选出若干个物品使得 \(\displaystyle\frac{\sum a}{\sum b}\) 最小/最大。

一般分数规划问题还会有一些奇怪的限制,比如『分母至少为 \(W\) 』。

二分法

分数规划问题的通用方法是二分。

假设我们要求最大值。二分一个答案 \(mid\) ,然后推式子(为了方便少写了上下界):

\[$ \displaystyle \begin{aligned} &\frac{\sum a_i\times w_i}{\sum b_i\times w_i}>mid\\ \Longrightarrow&\sum a_i\times w_i-mid\times \sum b_i\cdot w_i>0\\ \Longrightarrow&\sum w_i\times(a_i-mid\times b_i)>0 \end{aligned} $\]

那么只要求出不等号左边的式子的最大值就行了。如果最大值比 \(0\) 要大,说明 \(mid\) 是可行的,否则不可行。

求最小值的方法和求最大值的方法类似,读者不妨尝试着自己推一下。

Dinkelbach 算法

看不懂捏

Dinkelbach 算法的大概思想是每次用上一轮的答案当做新的 \(L\) 来输入,不断地迭代,直至答案收敛。

摩尔投票

一种求绝对众数的技巧,可用线段树维护。见博客

字符串算法的运用

Trie

批量按位贪心

给定多个串的集合 \(A\),多次询问串 \(b\)\(A\) 中一个数按位异或的最大值,可以把 \(A\) 建成 trie,然后把 \(b\) 放在 \(A\) 上贪心。

进一步的,允许在线插入数字,因此可以求一个序列中任选两个数异或的最大值。

数列数对xor求lowbit

给定数列,求数列中所有数对异或起来的lowbit之和。

建立 Trie,求 LCA 即可。

posted @ 2025-02-20 21:22  Luke_li  阅读(4)  评论(0)    收藏  举报