这几天题目总结
P5339 [TJOI2019] 唱、跳、rap和篮球
很好的一道题,先考虑容斥至少有 i 个讨论cxk的组,然后你发现你缺了一个剩下人的组合数
现有一个朴素的方法,就是分别枚举有 i 个人在做第一个运动,j个在做第二个运动……
这是一个n^4方的,可以用前缀和优化到 n^3
现在有一种用meet-in-middle的方法优化这个复杂度,我们考虑怎么做
我们枚举有 i个人在做 1或者 2 运动,有 j 个人在做 3或者 4 运动
分开求都是 n^2的 前缀和做到 O(n),乘上容斥的复杂度, O(Tn^2)
P5384 [Cnoi2019] 雪松果树
这个题很简洁,那么做法接不长,我们考虑一步一步想,肯定要把询问挂到 k-father上
因为我们有dfs序来维护子树,而 k-cousin 肯定在这个子树里面
接下来想到成为一个 k-cousin 的充要条件:
-
1 在子树里面
-
2 dep和 u 一样
-
3 不是 u本身
考虑一个一个处理,我们考虑离线,这样我们可以作差,答案就是 ans(dfn[fa]+siz[fa])-ans(dfn[fa])
其中ans是满足2的答案数目,第二个东西很好处理,我们直接开个桶就可以了
最后答案-1就处理好3了
接下来讲一下怎么处理挂载询问到k-father 那我们就需要在 u 找到 k-father,用一个栈来维护到1号节点的链
然后就做完了
P6902 [ICPC 2014 WF] Surveillan
这个题有个显然的贪心,我们每次一定选择从自己可以到达的最右侧,这样显然不劣
原因是我们可以到的最右侧是单调的,考虑枚举左侧起始点,断环成链,先思考链上怎么做
我们可以直接指针跑出来这个最大值直接跳,o(n)
但是我们在环上肯定不能这么做,因为可能有 n 个不同的环,思考怎么处理这种情况
先发现为什么不能直接转移,原因就是左端点不同,考虑最终可以成为答案,就是要跳的总长>n
和起始点没有任何关系,所以直接拆两倍环,这样左端点就固定了。
还有一种理解,就是因为你本来就要覆盖全部,所以你可以假设之前已经覆盖了,直接做
接下来考虑怎么枚举,这个最大值是可以合并,所以直接倍增就解决了。
P10780 BZOJ3028 食物
虽然这道题是生成函数班子,但是我们也可以直接考虑组合
虽然很难直接想到:发现可以单出来一个蜜桃多的情况下随意分割成4段
然后就可以做了,上面的组合中可以每段为0所以考虑加上段数组合C(3,N-1+3);
P1758 [NOI2009] 管道取珠
对于n很小的dp我们先考虑时间复杂度 n<500 那么应该是 n^3 的,考虑怎么传递答案
他说了\sum a_i 是一个组合数,考虑我们答案的组合意义,很巧妙。
就是两个人,同时做到相同方案的方案数字之和,每推进一步就考虑是不是现在就能做了
我们看到设计 在相同的情况下,两人选的长度为 i,第一人选了 j 个 上侧,第二个人选了 k 个上侧
发现可以直接转移 复杂度也没问题
计算复杂度的方法:状态数*转移时间,可以帮助你思考怎么优化dp
P3874 [TJOI2010] 砍树
先考到求的是最大比值,那么我们考虑分数规划,之后发现就是一个背包问题,考虑怎么处理
设在节点i的子树选了j个果子,从siz_i枚举就会少一个 n 的复杂度,树上背包都是这样,记住
因为一定连续所以必选,之后直接枚举答案就可以了(dp内部)
P8089 『JROI-5』Color
首先看数据范围,一定是 o(dep) 的,先考虑特殊部分:完美二叉树
那么但是可以递推的, \(f_i=(f_{i-1}+1)^2\)
接下啦发现其实普通情况和完全二叉树差不了多少
你发现可以找到左右两颗二叉树,其 dep 一样
在这个地方,我们发现这是一条链分割的这个东西
考虑链左右侧是什么,发现都是完美二叉树,那么边递归边计算答案就可以了!
当然也可以不递归,因为二叉树这条链恰好对应了输入的二进制位,很巧妙
P6655 [YsOI2020] 制高
发现自己的数学能力极差,首先看出来这是一道数学题 ,然后我们考虑怎么计算答案
考虑把 期望 拆成 概率*方案数 我们计算每一个点的成为有贡献的点的概率,考虑转移答案
发现 h 是一个偏序关系 那么我们就先排序,完了第一维度自动满足
推式子发现自己的概率 \(g_i=\sum{r_i}_{j=l_i} g_j \cdot [h_i>h_j]\)
这下我们就没有条件了,发现答案就是区间和,用数据结构维护就可以了,我用的是树状数组
P3129 [USACO15DEC] High Card Low Card P
这个做法比较有启发意义:
考虑一下我们肯定要像田忌赛马一样选择较为接近的
这个东西实际上是能用括号序列的最大匹配数维护的
就是先排序,然后把需要大于的那一侧作为右括号
而不是普通的用set来维护这个东西
然后还有一个性质,就是这两侧的操作是完全对成的
具体来说就是你最开始一定选前 k 个自己最大的牌一定不劣
反之也是的,所以我们就可以直接合并左右两侧的答案了
P2542 [AHOI2005] 航线规划
遇到删边就考虑反向操作,先想到缩点。答案就是长度。
然后考虑加边的贡献,那么就是把路径上点权赋值为0
考虑怎么把边权->点权
首先少了根节点,然后两点的路径你要记录边的上方和下方
路径上的边权给儿子那么lca的就不能修改了(**)
P8632 [蓝桥杯 2015 国 B] 居民集会
同样是序列上的dp问题,dp方程很好想
关键在于减少min()中的不变量
有两点:
-
1.提取方程中的只和当前枚举量有关系的量
-
2.对于求和若为 i~>j ,我们考虑用前缀和优化成sumi-sumj 这样再把乘法式子拆开那么就分离了
斜率优化常见形式:\(f_i=min{f_j+i\cdot t_j+w_j}+w_j\)
P8726 [蓝桥杯 2020 省 AB3] 旅行家
在遇到每次只能前往比自己节点大的节点,所以可以考虑用线性数据结构/dp维护。
因为在答案 i 被处理时 其所有前置节点的答案都被预处理出来了。
所以把前置节点当成常量,考虑dp,发现是典型的一次函数形式,考虑李超线段树。
这样就做完了。
P6594 [YsOI2020] 换寝室
树上差分那道题解,具体巧妙做法在于
1.用差分计边权
2.用了极差的性质,枚举时点的权在一个范围内,枚举这个范围
3.合并时用dp+分类讨论合并子树最小代价+套了一个二分

浙公网安备 33010602011771号