做题记录1:


P4587 [FJOI2016]神秘数

解法:主席树。

题目大意:给定n个数,求 l~r中的数的子集和不能表示出的最小数。

首先考虑暴力的解法:

将l~r中的数排序,设前 i 个数的和为sum 如果 \(a_{i+1}>sum+1\) 则sum+1无法表示,答案则为sum+1

这个时候可以用一种迭代法模拟这个过程,不妨我们设上一次的sum为pre:初始将sum=0,然后查询pre~sum+1数的和,然后将sum累加上这段和,直到这段区间没有数。显然:每次加的数\(\in[pre,sum+1]\) 那么每一次的累加要么没有直接停止,要么至少翻倍。

再用一个主席树维护就行了,复杂度 \(\Theta(n\log^2n)\)


2020牛客NOIP赛前集训营-提高组(第一场)D 牛牛的RPG游戏

解法:CDQ套李超树

题意:(简要题意略去)

一个朴素的DP方程:\(dp[i][j]=max(dp[i][j],dp[x][y]+val[x][y]+buff[x][y]*(i+j-x-y)) (x\leq i,y\leq j)\)

这个柿子长得就很想一个李超树。

用一个cdq维护整个矩形内关于 \(x,y\) 的偏序,然后用一个李超树维护就好了。

细节:首先插入直线的k值显然为buff值,但是b值通过一些容斥:显然就是本身的dp值+本身的val值-(x+y)*buff。


P4550 收集邮票

期望DP,倒着递推,设 dp[i] 表示已经取了 i 个,期望还需要取多少次,g[i] 表示取得期望价格。

显然有:

f[i]=f[i+1]+(1.0*n)/(1.0*(n-i));
g[i]=(1.0*i)/(1.0*(n-i))*(f[i]+1)+g[i+1]+f[i+1]+1;

P1654 OSU!

期望DP,较为简单的期望DP。

首先设前面一段有 \(x\) 个 1,那么当前又为 1所带来的差值也就是 \((x+1)^3-x^3=3*(x^2+x)+1\)

那么维护前缀中的 \(x^2,x\) 的期望,就可以求出 \(x^3\) 的期望了。


P4097 [HEOI2013]Segment

李超线段树模板题,区别为区间修改的李超树。


P4655 [CEOI2017]Building Bridges

李超线段树优化斜率优化DP。

很简单的模型随便推推柿子就出来了。

注意动态开点节点为空的时候的返回,上一道题Segment 可以返回 0,因为要求的是编号,而这次返回值,因为要求最小所以返回INF。


P6085 [JSOI2013]吃货 JYY