BJOI2019部分题解

送别估计是不会写了。勘破神机已填坑。代码就不贴了QAQ

奥术神杖

看到数据范围就会做了。。
∏ v i c = k ⇔ ∏ v i = k c ⇔ ∑ log ⁡ v i = c log ⁡ k ⇔ ∑ log ⁡ v i c = log ⁡ k \sqrt[c]{\prod v_i}=k\Leftrightarrow \prod v_i=k^c \Leftrightarrow\sum \log v_i=c\log k\Leftrightarrow \frac {\sum \log v_i} {c}=\log k cvi =kvi=kclogvi=clogkclogvi=logk

最大化 ∑ log ⁡ v i c \frac {\sum \log v_i} c clogvi ,01分数规划一下,然后在AC自动机上跑dp即可。注意精度问题。
时间复杂度 O ( s 2 ∗ log ⁡ ) O(s^2*\log ) O(s2log)

勘破神机

并不是一道有意思的题。
f ( i ) f(i) f(i) 表示宽为 n n n 的2型宝石的方案数, g ( i ) g(i) g(i) 表示宽为 n n n 的3型宝石,那么我们不难得到它的递推式:
f ( i ) = f ( i − 1 ) + f ( i − 2 ) f(i)=f(i-1)+f(i-2) f(i)=f(i1)+f(i2) g ( 2 i ) = g ( 2 i − 2 ) + 2 ∑ j = 1 i g ( 2 i − 2 j ) ⇒ g ( 2 i ) = 4 g ( 2 i − 2 ) − g ( 2 i − 4 ) g(2i)=g(2i-2)+2\sum_{j=1}^i g(2i-2j)\Rightarrow g(2i)=4g(2i-2)-g(2i-4) g(2i)=g(2i2)+2j=1ig(2i2j)g(2i)=4g(2i2)g(2i4)

F ( n , k ) = ( f ( n ) k ) , G ( n , k ) = ( g ( n ) k ) F(n,k)=\binom {f(n)} k,G(n,k)=\binom {g(n)} k F(n,k)=(kf(n)),G(n,k)=(kg(n))

因此我们就需要解决一个组合数的求和,注意到 ( n m ) = n m ‾ m ! \binom n m=\frac {n^{\underline m}} {m!} (mn)=m!nm

x k ‾ = ∑ i = 0 k ( − 1 ) k − i S 1 ( k , i ) x i x^{\underline k}=\sum_{i=0}^k (-1)^{k-i}S_1(k,i)x^i xk=i=0k(1)kiS1(k,i)xi

(1) ∑ i = l r F ( n , k ) = ∑ i = l r ( f ( i ) k ) = 1 k ! ∑ j = 0 k ( − 1 ) k − j S 1 ( k , j ) ∑ i = l r f ( i ) k \sum_{i=l}^r F(n,k)=\sum_{i=l}^r\binom {f(i)} k=\frac 1 {k!}\sum_{j=0}^k (-1)^{k-j} S_1(k,j)\sum_{i=l}^r f(i)^k\tag 1 i=lrF(n,k)=i=lr(kf(i))=k!1j=0k(1)kjS1(k,j)i=lrf(i)k(1) (2) = 1 k ! ∑ j = 0 k ( − 1 ) k − j S 1 ( k , j ) ∑ i = l r ( A x i + B y i ) k =\frac 1 {k!}\sum_{j=0}^k (-1)^{k-j} S_1(k,j)\sum_{i=l}^r (Ax^i+By^i)^k\tag 2 =k!1j=0k(1)kjS1(k,j)i=lr(Axi+Byi)k(2) (3) = 1 k ! ∑ j = 0 k ( − 1 ) k − j S 1 ( k , j ) ∑ r = 0 k ( k r ) A r B k − r ∑ i = l r ( x r y k − r ) i =\frac 1 {k!}\sum_{j=0}^k (-1)^{k-j} S_1(k,j)\sum_{r=0}^k\binom k r A^rB^{k-r} \sum_{i=l}^r (x^ry^{k-r})^i\tag 3 =k!1j=0k(1)kjS1(k,j)r=0k(rk)ArBkri=lr(xrykr)i(3)

我们求出 f ( i ) , g ( i ) f(i),g(i) f(i),g(i) 的通项公式,枚举 j , r j,r j,r,对后面的用等比数列求和。只需要预处理求下降幂的系数即可。
如果模意义下没有二次剩余,可以写个结构体来表示数字 a + b 5 a+b\sqrt 5 a+b5 ,重载一下运算符就能用。

时间复杂度 O ( k 2 log ⁡ n ) O(k^2\log n) O(k2logn)

排兵布阵

所有对手分开考虑,不难发现每个城堡的士兵数量只可能有 0 0 0 2 x + 1 2x+1 2x+1 两种可能,暴力背包 O ( s n m ) O(snm) O(snm)

光线

挺有意思的一道题。为了方便表述,我们约定玻璃的上表面为正面,下表面为反面,下标同题面。

先考虑只有两块玻璃的情况,我们可以设上面的玻璃的反面总共接受了 x x x 份光,下面玻璃的正面总共接受了 y y y 份光。列出方程即可解: x = y ∗ b 1 , y = a 0 + x ∗ b 2 x=y*b_1,y=a_0+x*b_2 x=yb1,y=a0+xb2

然后我们可以把两块玻璃合成为一块玻璃,然而合成后的玻璃正反的透射和折射率并不相同,所以只要维护合成玻璃的正面透光率和反面反射率即可。最后合并成一块玻璃输出透光率。

时间复杂度 O ( n log ⁡ p ) O(n\log p) O(nlogp),其中 log ⁡ p \log p logp 来源于求逆元。

删数

很巧妙的一道题。有这么一个结论,把当前序列中 [ 1 , n ] [1,n] [1,n] 中的数字画成柱状图,然后把所有柱子向左倒,则 [ 0 , n ] [0,n] [0,n] 中的未被覆盖的长度即为答案。

用线段树维护最小值和其出现次数即可。注意到超出左边界的柱子不会对答案造成影响,我们只对右端点进行加入和删除即可。

时间复杂度 O ( ( n + m ) log ⁡ n ) O((n+m)\log n) O((n+m)logn)

你可能感兴趣的:(BZOJ)