这几天题目总结

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+分类讨论合并子树最小代价+套了一个二分

posted @ 2025-09-26 21:18  NeeDna  阅读(8)  评论(0)    收藏  举报