杂项 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\) ,然后推式子(为了方便少写了上下界):
那么只要求出不等号左边的式子的最大值就行了。如果最大值比 \(0\) 要大,说明 \(mid\) 是可行的,否则不可行。
求最小值的方法和求最大值的方法类似,读者不妨尝试着自己推一下。
Dinkelbach 算法
看不懂捏
Dinkelbach 算法的大概思想是每次用上一轮的答案当做新的 \(L\) 来输入,不断地迭代,直至答案收敛。
摩尔投票
字符串算法的运用
Trie
批量按位贪心
给定多个串的集合 \(A\),多次询问串 \(b\) 与 \(A\) 中一个数按位异或的最大值,可以把 \(A\) 建成 trie,然后把 \(b\) 放在 \(A\) 上贪心。
进一步的,允许在线插入数字,因此可以求一个序列中任选两个数异或的最大值。
数列数对xor求lowbit
给定数列,求数列中所有数对异或起来的lowbit之和。
建立 Trie,求 LCA 即可。

浙公网安备 33010602011771号