2024.8.2 test

A

有长度为 \(n\) 序列 \(A\),你要把构造长度相同的序列 \(B\) 使得 \(\sum B_i=m\)
满足随机打乱 \(B_i\) 后,期望 \(\sum [A_i>B_i]\) 最小,求这个值。\(n\le 1000,m\le 5000\)

我们考虑背包,也就是 \(0\sim m\) 的数选 \(n\) 个出来,和为 \(m\)
\(sum_i\) 表示 \(A_i\) 里不超过 \(i\) 的个数,选 \(i\) 的期望代价是 \(g_i=\dfrac{n-sum_i}{n}\)
那么我们有 \(nm\) 个状态,\(f_{n,m}\) 表选了 \(n\) 个数和是 \(m\),我们如果枚举选的数是要 \(O(n^2m)\) 的。
我们更改枚举顺序,不难发现是 \(g\)\(f_{i}\)\(n\) 次 min + 卷积。
那么我们有两种优化方式:第一是优化 min + 卷积,用民可夫斯基和,但是 \(g\) 是非凸的。
所以我们优化 \(n\),类似快速幂,做 \(\log n\) 次即可。

B

有向图上强制在线询问 \(s\to t\) 经过点序列字典序最小的路径第 \(k\) 个点,注意这里路径可以重复经过点。
如果路径一直绕环走,判断无解。
\(n\le 2000,m\le 5000,q\le 4e5\)

字典序最小那么这是直接贪心可做,每次都向后走编号最小的点。
路径重复经过点的话,可能会一直在环上走,我们判一下当前位置会不会由环而来即可。
不妨每个点为起点都跑一遍,跑出来是一棵树。
询问也就是在线求 \(k\) 级祖先,求简单直接分块,预处理所有 \(kB\) 级祖先。

C

维护序列 \(A\),支持区间加。查询从 \(l\)\(r\) 出发,仅遍历 \([l,r]\) 每个点恰好 \(A_i\) 次,可以向左或向右走。
\(n,m\le 2e5\)

我们先有一条从 \(l\to r\) 的路径,所以可以把 \(A_i\) 都减去 \(1\),我们现在相当于插入环。
我们是可以走出这样的覆盖情况:\(11,121,1221\) 这种,不难发现只用走 \(11\) 就可以包括所有情况。
那么很简单了,分奇偶性讨论,线段树。

D

\(n\) 个点,每个点有权值,有 \(m\) 个关系 \((i,j)\),表示选了 \(a_i\) 必须选 \(a_j\),最大化 \(\dfrac{(\sum a_i)^2}{\sum a_i^2}\)
\(n\le 60\)

考虑分数规划,二分 \(k\),同时设 \(d_{i}\) 表示 \(a_i\) 是否被选中,设 \(d_{i,j}=d_id_j\),判断是否有
\(\sum_{i\neq j}d_{i,j}a_ia_j-k\sum_i d_{i,i}a_i^2>0\).
\(d_{i,j}\) 是因为贡献是关于点对的,把状态拆开成二维的想法非常关键。
那么 \(d\) 跑最大权闭合子图,但是原来的约束是 \(d_{i,i}\to d_{j,j}\) 之间,加上 \(d_{i,j}\to d_{i,i},d_{j,j}\)
而且不会出现 \(d_{i,i}\)\(d_{j,j}\) 同时存在,因为 \(d_{i,j}\) 明显选了更优。
跑 flow。
如果数据范围小的话记得想高复杂度的东西,比如 flow。

posted @ 2024-08-02 19:46  s1monG  阅读(17)  评论(0编辑  收藏  举报