window.cnblogsConfig = { homeTopImg: [ "https://cdn.luogu.com.cn/upload/image_hosting/clcd8ydf.png", "https://cdn.luogu.com.cn/upload/image_hosting/clcd8ydf.png" ], }

2024年题目选讲

本文会统计一些做过的绿题及以上,总结一些解法,写一些简短的题解,学习何竺凌学长大佬。

修改链接

2024.1

AT_abc271_e

可以用 DP 来解决。\(dp_{i,j}\) 代表着第 \(i\) 条边,点 \(1\)\(j\) 最短距离。考虑转移方式:如果需要这个边 \((u,v,w)\) 那么,\(dp_{i,j} = dp_{i-1,u} + w\)。不需要这个边:\(dp_{i,j}=dp_{i-1,j}\)\(j\) 其实就是 \(v_i\)。空间的限制,所以我们没法开二维数组来存储。发现 \(i\)\(i-1\) 转移来,所以说,我们可以压维。因此就得到了正解。

AT_abc271_f

常见的meet in the middle 典题 由于 \(n \le 20\) 所以最多走 \(40\) 步,那么直接折半搜索解决

CF1006F

AT_abc271_f的双倍经验,需要小修改即可。

AT_abc268_e

首先,对于每一个人 \(i\) 都有自己想要匹配的 \(i\) 餐桌。于是想到,转动餐桌会使得餐盘离这个人出现两种情况: 先递减再递增 或 先递增再递减。很容易想到,这其实可以看作一个很多条一次函数的直角坐标系。我们需要手推一下每一个点的地方,然后跑两遍前缀和就可以解决。由于奇偶的情况不一样,所以要分讨。其实,就是偶数一个峰值,奇数两个峰值,手推即可知道。但其实我们只需要建立顶点 \(i+\dfrac{n}{2}+1\)\(i+\dfrac{n+1}{2}+1\) 即可。因为我们想要把直线直接延伸到比 \(n\) 大的地方以免发生取模错误。所以直接 \(+n\) 地套上去。

AT_abc268_d

这个题精髓在于暴搜,剪枝即可。

AT_abc268_f

这题使用贪心来解。首先我们用两个变量 a:代表这个字符串数字之和,b代表x的之和如果最后的排列 \(i<j\) 那么有 \(a_i.b * b_j.a\)。反之 \(i>j\) 那么有 \(a_i.a * b_j.b\) 为了使得答案最大化,只需要对其进行sort一遍。

洛谷 P3128

对于这个可以用LCA解决。两个点的距离肯定与LCA有关,所以在一条路径上只需要对 x 和 y 点的差分 +1,然后他们的LCA - 2 即可。然后会发现此时LCA这个点少一个贡献,所以后面再开一个数组给他补上即可。

CF29C

题目就是要在图中找一条经过所有边的链。实际上就是要找到这条链的起点,因为一个点度数为 \(1\) 那么肯定是起点或者终点,那么找到度为 \(1\) 的点为起点。然后从起点开始 dfs 暴力寻找路径,直到找到那个终点,然后因为有 SPJ 所以可以轻松通过此题目。因为每一个点的数值很大,所以我们需要 map 里放 vector。

CF533B

因为奇偶性,所以我们可以开一个二维的 DP 来计算。首先处理状态转移方程:\(dp_{i,j}\) 中代表 \(i\) 这个子树里奇偶情况为 \(j\) 的最大权值和。如何转移?偶数可以由两个偶数加两个奇数组成。奇数只能奇数加偶数。于是我们可以得到转移方程。\(dp_{i,0} = \max(dp_{i,0}+dp_{j,0},dp_{i,1}+dp_{j,1})\)\(dp_{i,1} = \max(dp_{i,0}+dp_{j,1},dp_{i,1}+dp_{j,0})\)。其中,\(j\)\(i\) 的一个子节点。然后又有 \(dp_{i,1} = \max(dp_{i,1},dp_{i,0} + num_i)\)。于是树形 Dp 直接转移即可。

洛谷 P3398

对于这道题可以用LCA来解决,很显然,如果两个链有相交,那么他们的LCA也会落在对方的链上面。对于 \((a,b)\) 这一条链,他需要看 \((c,d)\) 是否与他相交,只用看 \(a\)\(lca(c,d)\) 的距离 + \(b\)\(lca(c,d)\) 的距离是否等于 \(a\)\(b\) 的距离,之所以能这样做,是因为一条链上两条端点的 lca 一定是在这一条链上面。对于距离只需要算 lca 即可。

posted @ 2024-01-06 08:28  gsczl71  阅读(57)  评论(0编辑  收藏  举报