4.7杂题

一.记几个性质\(/\)结论\(/\)奇怪的东西

  • 1.若干个数两两异或的最小值必在排序后相邻两个取到

  • 2.贝叶斯公式 \(p(A|B)=\frac{p(AB)}{p(B)}=\frac{p(B|A)p(A)}{p(B)}\)

二.例题

A.

 根据期望的线性性,单独考虑每种颜色的贡献

 先考虑绿球,由于我们只考虑蓝绿之间的先后关系,此时不用考虑红球

 考虑第一次摸到蓝球之前摸了几个绿球

 可以列出柿子 \(E=\frac{G}{B+G}(E+1)\rightarrow E=\frac{G}{B}\)

 那么绿球的总期望就是 \(\frac{kG}{B}\)

 再考虑红球,我们对每个红球考虑它被拿的概率

 对于一次取了红或蓝的操作,某个红球没有被拿出的概率是 \(\frac{B}{B+1}\)

 那么某个红球最终没有被拿出来的概率就是 \((\frac{B}{B+1})^k\)

 所以答案是 \(k+\frac{kG}{B}+R(1-(\frac{B}{B+1})^k)\)

B.【UOJ#299】游戏

 考虑维护每个被已知点隔开的区间的答案,显然的每次操作相当于合并\(/\)分裂区间

 同样考虑每个点的贡献

 由于每个点的贡献只和左边有关且需要支持合并,所以考虑维护区间左右状态分别为 \(A,B\) 的答案

 用贝叶斯公式化一下每个点的贡献 \(P(x|(AB))=\frac{P((XB)|A)}{P(AB)}\)

 分母可以很容易用线段树维护矩阵得到,考虑分子

 考虑在线段树上维护 \(E(A,B),P(A,B)\) 表示左右分别为 \(A,B\) 时的期望和概率

 同样线段树维护矩阵,很容易在线段树上合并

C.AGC035D

 题意就是找一个不为左右端点的点然后把他的权值加到两边的点上

 发现最终的答案一定是 \(\sum\limits_{i=1}^n a_ival_i\) 的形式

 设 \(dp[l][r][a][b]\) 表示区间 \([l,r]\) 中,\(a_l=a,a_r=b\) 的最小值

 枚举分界点,有 \(dp[l][r][a][b]=\min\limits_{i=l}^r(dp[l][i][a][a+b]+dp[i][r][a+b][b]-val[a]\times(a+b))\)

D.CF765F

 考虑所有对于一个右端点 \(r\) 有贡献的点 \(l\)\(a_r>a_l\)

 显然的对于 \(l1>l2>l3>...>l_k\)\(a_{l_1}<a_{l_2}<a_{l_3}<...<a_{l_k}\)

 而且 \(a_r-a_{l_i}>a_i-a_{l_{i-1}}\) 所以 \(2a_{l_i}<a_r+a_{l_{i-1}}\)

 发现 \(a_{l_i}\) 每次折半,所以最多有 \(log\)\(l\),直接找出来就行

E.

 枚举有多少位 \(<L\) 来容斥

 设 \(dp(b,A,B,m,n)\) 表示 \(>b\) 位已经满足,现在有 \(m\) 个位置 \(lim=A\),其余位置 \(lim=B\) 的方案数

 转移时直接分类讨论

 若所有 \(lim\ge 2^b\) 的点都选了这一位,直接递归求解 \(dp(b-1,A\ge 2^b?A-2^b:A,B\ge 2^b?B-2^b:B,m,n)\)

 否则出现了一个数可以取任意值,那么剩下的位其他数都可以随便选了

 然后我们需要让他满足这一位的要求,这个可以矩乘快速幂优化 \(dp\)

 那么答案就是 \(\sum\limits_{i=0}^n(-1)^i\binom{n}{i}dp(30,L-1,R,i,n-i)\)

 然后考虑分类讨论的两种情况

 对第一种有影响的只有 \(i\) 是否为 \(0\)

 第二种相当于在 \(n\) 个点里选 \(i\) 个点然后容斥

 我们可以把这个选择也放到 \(dp\) 转移中,修改一下矩阵就行了

F.n个节点二叉树的期望叶子个数

 一棵二叉树的一个叶子可以表示成 \(T(n-1,pos)\) 表示一棵 \(n-1\) 个点的二叉树和这个叶子所在位置

 考虑对 \(T\) 来计数

\(n-1\) 个点二叉树个数为 \(Catlan_{n-1}\),可以放叶子的位置个数为 \(n\)

 那么答案就是 \(\frac{C_{n-1}n}{C_n}=\frac{n(n-1)}{2(2n-1)}\)

G.【UOJ#424】count

 转化题意后我们要计数有多少大小为N的二叉树,满足从根节点走到任意一个节点向左走的次数不超过M

 暴力的话考虑模拟先序遍历的过程并记录向左走了多少次,复杂度 \(O(NM)\)

 记到每个点考虑 \(dp\) 的过程,

 发现相当于我们有一个变量 \(x\),每次可以选择把 \(x\) 变成 \([0,x+1]\) 的任意一个数,保证 \(x\le M\)

 把 \(x\) 的变化过程看成一个序列 \(A\),我们需要的就是计数这个序列的方案数

 令 \(P_i=i-A_i\),写出 \(P\) 的限制条件

  • 1.\(-M\le P\le i\)
  • 2.\(P_1=1,P_{n+1}=n+1\)
  • 3.\(P_i\le P_{i+1}\)

 发现这相当于在网格往右上行走,不能经过 \(y=x+1和y=x-M-1\) 的方案数

 这个可以用折线法来做

 具体的,每经过一次某条线就把终点对于这条线翻转并乘上 \(-1\) 的系数

H.CF603E
 题目描述:有n个点,依次加入m条边权为 \(l_i\) 的无向边,

   每次加入后询问:当前图是否存在一个生成子图,满足所有点的度数都是奇数。

   如果有,输出这个生成子图中边权最大的边的权值最小可能是多少

 发现当且仅当所有联通块大小都为偶数时有解

证明:对于一个联通块,任选一棵生成树,非树边任选,通过树边来控制度数就行

 然后发现显然的加边越多越容易合法

 用 \(LCT\) 维护一下最小生成树,尽量删掉权值大的边就行

猜你喜欢

转载自www.cnblogs.com/mikufun-hzoi-cpp/p/12653645.html
4.7
今日推荐