nf #34
A
定义两个长度相等的数列相似,当且仅当每个下标对应值在两个数列中的排名相等。
对于一个长 \(n\) 的排列,定义 \(f(A,k)\) 表示有多少长 \(k\) 的排列和 \(A\) 的至少一个子序列相似。
排列 \(A\) 的值是 \(\sum_{k=1}^n [f(A,k)=C_n^k]\)。给出一个排列,有若干位置待定,求值最大且字典序最小的排列。
\(n\le 20\)。
\(f(A,k)=C_n^k\) 的含义是:每个子序列都是两两不相似的,所以能贡献的 \(k\) 一定是 \([n-t,n]\) 的形式。
考虑从 \(k=n-1\) 开始,注意到,合法的排列满足序列中相邻的数值域上不连续。
\(k=n-2\) 的话,序列中不存在相邻且差 \(\le k\) 的,且连续的数位置的差 \(>k\)。
进一步的,这个限制有一点丑,考虑合并成一条式子:\(\forall i\neq j,|p_i-p_j|+|i-j|> k\) 即满足条件。
证明的话从 \(k=n-1\) 开始,相邻的如果也连续,那么删除他们两中一个都是等价的。
进一步,我们删了一个之后再删一个数,还是要满足相邻的不连续,就有了上面的式子。
这个限制非常苛刻,我们考虑直接爆搜通过。
B
有 \(n\) 个物品,有重量 \(w\) 和价值 \(v\),\(q\) 次询问,背包大小为 \(m\),对于每次询问,你不断选择物品直到背包正好装满,求最大收益和达成最大收益的方案数,即物品选择的顺序需要被考虑。
\(n,w,q\le 100,m\le 10^9\)。
由于 \(w\) 比较小,所以可以被转移的不多,而 \(m\) 很大,所以我们考虑矩阵快速幂。
设 \(f_i,g_i\) 表示当前选了 \(i\) 重量,方案数以及最大收益的值,转移枚举上一个选了什么。
但是,我们怎么知道哪些转移是最大收益的呢?考虑矩阵里直接记一个双元组 \((f,g)\)。
对于双元组我们可以定义新运算,设 \((f_1,g_1)+(f_2,g_2)=([g_1\ge g_2]\cdot f_1+[g_2\ge g_1]\cdot f_2,\max(g_1,g_2))\)。
\((f_1,g_1)\times (f_2,g_2)=(f_1\times f_2,g_1+g_2)\),而矩乘就是 \(C_{i,j}=\sum_{k=1}^n A_{i,k}*B_{i,k}\)。
其实,只需要把矩阵优化理解为倍增优化 dp 即可。
最后,我们是向量乘矩阵,把所有 \(k\) 的 \(T^k\) 预处理出来,复杂度是 \(w^3\log m+w^2n\log m\)。
C
有 \(n\) 个位置,\(q\) 次询问,每次给出一个起始点,然后每次可以向左或向右扩展 \(1\)。
有 \(m\) 次收益,诸如若第 \(x\) 次拓展是 \(p\),则可以获得 \(w\) 的收益。问最大收益。
\(n\le 10^9,m,q\le 10^9\)。
收益的形式很丑陋,根据 \(s,p\) 的关系写成两种区间:\([p-x+1,p],[p,p+x-1]\) 代表当前区间形式。
那么我们要选出若干包含关系的区间,且 \(w\) 的和最大。
如果是单次询问,那么可以把左端点排序了,右端点相当于一个 LIS 的形式。
多次询问的话考虑把所有区间都并起来算,相同 \(p\) 的一对区间事实上最多选一个所以互不影响。
对于每个询问呢,我们考虑扫描线,如果 \(f_i\) 表示以 \(i\) 结尾的答案,然后相当于求若干 \(f_i\) 最大值。
这个容易计算的。
这题的话呢相当于转化为 LIS 模型。