CF1461F
题意
给定长度为\(n\)的整数序列\(\{a_i\}(a_i\in[0,9])\),给定运算集合,保证其为\(\{+,-,*\}\)的非空子集
求一种方案使得在任意\(i,i+1(i<n)\)间插入给定运算集合中的元素,使得运算结果最大
\(n\in[1,10^5]\)
做法
以下考虑运算集合大小不为\(1\)的情况
对于运算集合为\(\{+,-\}\),显然最优解只会用到\('+'\)
对于运算集合为\(\{-,*\}\),在第一个\(0\)前放\('-'\),其他位置放\('*'\),正确性显然
对于运算集合为\(\{+,-,*\}\),显然不会出现\('-'\)
以下讨论运算集合为\(\{+,*\}\)
对于出现的\(0\),我们会在其前后放\('+'\),故转化:
\(\{a_i\}\),满足\(\forall i\in[1,n],a_i\ge 1\)
显然对于首或尾的\(1\),我们会在其前后放\('+'\),故转化为:
\(\{a_i\}\),满足\(a_1,a_n>1\)
结论1:若\(\prod\limits_{i=1}^n a_i\ge 2n\),则全部用\('*'\)连接起来最优
证明:
假设乘积\(\ge 2n\)
若中间出现了\('+'\),则最优解一定是这种形式
\((d_{11} * d_{12} * d_{13} * … ) + 1 + 1 + … 1 + (d_{21} * d_{22} * …) + 1 + 1 + … + (d_{k1} * d_{k2} * …)\)
其中\(k\ge 2\)
令\(a_i = d_{i1} * d_{i2} * …\),令\(P=\prod\limits_{i=1}^k a_i\)(\(k\ge 2,P\ge 2n\))
我们可以证明\(\sum_{i=1}^k a_i \leq 2 + P / 2\),那么\(\sum_{i=1}^k a_i \leq 2 + P / 2\leq 2 + P / 2 + n - k \leq P / 2 + n\)
由于\(P\ge 2n\),则\(P/2+n\le P\),故全部用\('*'\)最优
下面证明\(\sum_{i=1}^k a_i \leq 2 + P / 2\)
对\(k\)施归纳:
当\(k=2\)时,\(a_1 + a_2 = a_1 + \frac{P}{a_1}\),这是对勾函数的形式,由于\(a_i\ge 2\),故\(a_1 + \frac{P}{a_1}\leq 2 + P / 2\)
对于\(k>2\),由于\(a_i\ge 2\),故\(\sum_{i=1}^k a_i \leq (\sum_{i=1}^{k-2}a_i) + a_{k-1}a_{k}\),这是\(k-1\)的形式
得证
根据结论1,我们仅需考虑\(\prod\limits_{i=1}^n a_i< 2n\)的情况
令\(f_i\)为前\(i\)个位置的最大答案(钦定\(i\)与\(i+1\)间用\('+'\)连接)
若\(a_{i+1}=1\),我们可以只将\(f_i\)转移到\(f_{i+1}\)那里
若\(a_{i+1}>1\),枚举\(f_i\)转移到\(f_j(j>i)\)
由于其中\(a_i\ge 2\)的个数只有\(O(logn)\)个,这个dp的时间复杂度为\(O(nlogn)\)