信息论
信息论
信息熵:一个随机变量 \(x\) 的信息熵为 \(H(x)=-\sum p_i\log p_i\),\(p_i\) 为取 \(i\) 的概率。
-> \(1\sim n\) 随机变量熵为 \(\log n\)。
-> 恒为 \(1\) 的一个变量没有任何信息。
-> 均匀分布变量的信息熵是最大的。
哈夫曼编码:设 \(x\) 有 \(1/2\) 概率为 \(1\),\(1/8\) 概率为 \(2\sim 5\),那么信息熵为 \(2\)。
考虑哈夫曼编码为 \(1,000,001,010,011\),用它表述 \(x\),期望长度与信息熵相同,也确实为 \(2\)。
回忆哈夫曼编码的方式是每次合并概率最小的两个,这是否有什么奥秘?
联合信息熵:考虑两随机变量 \(x,y\)。
-> 若 \(x,y\) 完全独立,信息熵为二者之和。
-> 若 \(x,y\) 完全不独立,信息熵为其一,且二者信息熵应相同。
-> 后略。
例题:若 A 有一个长为 \(7\) 的串 \(S\),A 可以发送长度为 \(10\) 的串传递给 B,C 可以随机选一个位置反转,问 B 能否收到 \(S\)。
衡量 B 收到了什么信息。
串 \(S\) 的信息熵是 \(7\)。C 操作的信息熵可以用一个 \(0\sim 10\) 的数表示,那么信息熵是 \(\log 11>3\)。
那么试想 C 就是 A,那么 A 传递给 B 的信息熵 \(>10\),不可能传递。
考虑一个长度为 \(11\) 的串,前 \(7\) 位是 \(S\),接下来 \(3\) 位记录二进制第 \(i\) 位为 \(1\) 的异或和,最后一位记录所有数的异或和。那么无论怎么改都可以校验出来。
从信息的角度证明复杂度:
若有 \(n\) 种情形,每次询问有 \(m\) 种答案,那么至少询问 \(\log_mn\)。
比如排序的复杂度是 \(O(n\log n)\)。即有 \(n!\) 种情形,每次比较有两种答案。
交互
ARC154D A + B > C ?
注意到若知道一个 \(1\) 的话可以转化为问 \(p_i+1>p_j\) 即 \(p_i\ge p_j\),现在问题变为找 \(1\)。
考虑 \(1\) 的性质,若两个 \(1\) 在不等式左边那么一定不成立;若 \(1\) 在不等式右边就一定成立。
反之,若某数在左边成立了或在右边不成立就一定不是 \(1\),所以我们扫一遍,每次保留合法的那边。
即若成立就保留右边,反之保留左边。这个扫一遍的想法在交互中很常见。
P6837 [IOI 2020] 数蘑菇
观察到 \(226\times \log 20000<20000\),所以无法确认所有蘑菇的种类。
其中,\(\log 20000\) 是单次询问的信息熵,\(20000\) 是总的信息熵。
有两种询问方式:\(\{A,x\}\) 可以问出 \(x\) 的种类,\(\{A,x_1,A,x_2\dots,A,x_n\}\) 可以问出 \(x_1\sim x_n\) 有多少 B。
那么有一个根号做法,先问出若干个 \(A\) 或 \(B\),然后批量继续问下去,是根号级别的。
尝试优化常数,考虑 \(\{A,x,A,x\}\) 一次可以问出两个。
两次可以问出五个,考虑 \(\{A,x,A,y,A,z\}\),那么可以问出 \(z\),若 \(x\neq y\) 就继续问。
后面就不会了。考虑问 \(\{A,x\}\),这样可以
AGC044D Guess the Password
势能分析
例题 \(1\),区间加,区间开根,区间和。
令势能为 \(\sum \log \log |a_i-a_{i-1}+1|\) 即可。分析略。
其他有很多公式题目。
势能分析与信息论的关系:
当数的值域变小或种类变少,这些数被认为是趋同,也就是信息熵减少了。
Qoj # 9986. Shiori
考虑没有区间赋值怎么做。
考虑称 \(<\) mex 的都参与了 mex 的运算,那么这些数运算后至少翻倍。
所以一个数最多参与 \(O(\log n)\) 次运算,那么考虑写一棵平衡树,每次取出区间 \(\min\) 重复即可。
考虑加上区间赋值,那么我们用平衡树维护连续段即可。复杂度是 \(O(n\log ^2n)\) 的。
CF1924F Anti-Proxy Attendance
考虑对每个人维护序列 \(S_i\) 表示其询问的结果。其中 0 表示其回答不在区间,1 表示在。
由于交互库不会连续三次说谎或不说谎,那么若 \(S_i\) 出现连续三个 0/1 那么 \(i\) 一定不是答案。
考虑对每人的序列后两位设计势能,不妨设 \(H(00)=H(11)=1\),\(H(01)=H(10)=x\)。
同时若一个人确定不是答案那么我们直接令其的势能为 \(0\)。
序列的总势能 \(E=\sum H_i\)。当 \(E\) 足够小的时候那么就求出答案了。
考虑交互库的做法,交互库返回 \(0/1\) 取决于哪个势能更大。
\(E_0=[区间内]((c_{01}+c_{11})x+c_{10})+[区间外] ((c_{00}+c_{10})x+c_{01})\),\(E_1\) 同理。\(c\) 表示出现次数。
考虑求 \(\frac{E_0+E_1}{E}\),对于 00,11 的是 \(x\),01,10 的是 \(\frac{1+x}{x}\)。令 \(x=\frac{1+x}{x}\) 那么 \(x=\phi=1.618\)。
为什么要令 \(x=\frac{1+x}{x}\) 呢?因为让两种情形势能相同就可以避免其中一种过多/过少的情况。
所以 \(\frac{\max (E_0,E_1)}{E}\ge \frac{\phi}{2}\)。也就是说一次询问至多使得 \(E\) 变为 \(\frac{\phi}{2}\) 倍。
我们的询问需要使得 \(\max(E_0,E_1)\) 尽量小,可以证明 \(E_0-E_1=O(1)\)。所以询问是 \(O(\log_{\phi}n )\) 级别。
具体地,即区间为空集时/区间为全集时,回答 \(0,1\) 后的势能为 \(E_{0,0},E_{0,1},E_{n,0},E_{n,1}\)。
那么 \(E_{0,0}=E_{n,1},E_{0,1}=E_{n,0}\),这两个曲线总有相交处,此时的差为 \(O(1)\)。
问题是我们怎么找到这个相交处的区间呢?直接钦定左端点为 \(1\),然后扫一遍找最优的即可。
也就是说我们每次通过合理的询问使得势能一直减少,信息量一直变多。
均摊分析
树形背包复杂度:
\(n\) 个大小为 \(1\) 集合,任意合并大小为 \(x,y\) 两集合,代价为 \(\min(x,k)\times \min(y,k)\),求最大代价。
\(k=n\),那么考虑每两个集合对最多贡献 \(1\) 的代价那么代价最多 \(O(n^2)\)。
考虑普通情况,当合并两个集合是 \(O(k^2)\) 时,最多合并 \(O(\frac{n}{k})\) 次,所以这里是 \(O(nk)\)。
CF2026F Bermart Ice Cream
由于背包无法支持删一个元素,明显是双栈维护队列(Baka's trick),然后建出版本树即可。
但是有一个问题,我们上述做法是均摊复杂度,而均摊做法是不能支持可持久化,也就是撤销不了的。
考虑双栈维护 deque,也就是当一边栈空了之后不是全部挪到另一边,而是分一半到两边。
queue 的撤销相当于 deque 的 pop_front,push_back。
分析一下复杂度,设 \(k_i\) 为第 \(i\) 次重构时的大小,\(q_i\) 为上一次重构到现在加入双端队列的元素数量。
那么 \(k_i=\frac{k_{i-1}}{2}+q_i\)。重构复杂度为 \(O(\sum k_i)\)。发现 \(q_i\) 对 \(k_{i+j}\) 有 \(\frac{q_i}{2^j}\) 的影响。
那么复杂度就是 \(O(\sum (1+\frac{1}{2}+\dots)q_i)=O(n)\)。 记得乘上背包的值域所以是 \(O(nm)\)。

浙公网安备 33010602011771号