做题记录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。