随笔分类 -  题解

摘要:传送门 解题思路 我们先考虑k==1的情况,这时候一定选取的是树的直径的两个端点。 因为不加这条新路每个边一定走两次,加上了之后道路两个端点之间的路径只需走一遍,所以贪心思想,一定是选取最长的路径的两个端点,即树的直径。 再考虑k==2的情况,一种情况是新加的道路的两个端点之间的路径与加的第一条边两 阅读全文
posted @ 2020-10-14 23:30 尹昱钦 阅读(129) 评论(0) 推荐(1)
摘要:传送门 解题思路 先看一下数据范围,a、b、c都是10^6,所以大体推断出做法时间复杂度约为nlogn。 根据axy=(ax)^y,所以ab!=(((((a^1)^2)^3)^4)^……)^b。 用底数变化的快速幂(O(logb))做b次即可。 或者对指数b!做一些处理—— 我们知道指数b!一定不能 阅读全文
posted @ 2020-10-01 15:36 尹昱钦 阅读(423) 评论(1) 推荐(1)
摘要:传送门 解题思路 题目很长,实际上就是给你一棵树,然后给你三个点,让你找到一个点,是这个点到三个点的距离和最短。 很显然的是,这个点在这三个点简单路径的上,而这三条简单路径一定有且只有一个交汇点,这个交汇点就是答案。 这就是为什么一定有一个交点,而且这个交点是其中两个点的LCA,且这个LCA是深度最 阅读全文
posted @ 2020-09-21 23:54 尹昱钦 阅读(170) 评论(0) 推荐(0)
摘要:传送门 传送门(加强版) 解题思路 这道题是我在学校里讲课的题,放上课件下载地址:https://files.cnblogs.com/files/yinyuqin/树网的核.ppt。 感觉课件里讲的还是比较详细的。 先说一下n^3做法:Floyd预处理出树中任意两点之间的距离,然后在直径上暴力枚举核 阅读全文
posted @ 2020-09-21 23:21 尹昱钦 阅读(305) 评论(0) 推荐(0)
摘要:传送门 解题思路 很显然,就是在一棵树上,求两条路径有没有交点。 我们可以先分别求出两条路径两段点的LCA,设为rtab和rtcd然后分以下情况讨论: 当rtab==rtcd时,一定有交点(就是这个LCA)。 当rtab的深度大于c和d的深度或者rtcd的深度大于a和b的深度时,一定没有交点。(因为 阅读全文
posted @ 2020-09-20 00:14 尹昱钦 阅读(159) 评论(0) 推荐(0)
摘要:传送门 解题思路 先考虑一个点。肯定是在树的直径的中间rt。 树的直径就是树上距离最远的两个点的路径。 对于树的直径求法,常用的有两种。 两遍bfs或dfs,从任意一个点开始,找到距离这个点最远的点i,再从i开始,找到距离i这个点距离最远的点j,则i、j就是树的直径的两个端点(证明略)。 树形dp也 阅读全文
posted @ 2020-09-13 21:46 尹昱钦 阅读(178) 评论(0) 推荐(0)
摘要:传送门 解题思路 为什么要找树的重心呢?假设我们已经找到了树的重心,如果把开会地点从重心向右移走,那么对答案的贡献就是+左边的元素和-右边的元素和。而因为是树的重心,所以向右移走后左面的元素数量一定大于右面的元素数量,所以ans是比在重心的情况大的,所以最终我们选择重心。 AC代码 #include 阅读全文
posted @ 2020-09-12 23:05 尹昱钦 阅读(381) 评论(0) 推荐(0)
摘要:传送门 解题思路 求LCA一般可以用倍增、树链剖分、tarjan算法解决。 这里只介绍树剖。 先处理出每一条链的链顶,然后对于每两个要求的点,判断是否在同一条链上。如果在,那么深度较浅的点就是LCA。 如果不在同一条链上,就比较两个所在链的链顶的深度,把链顶深度较低的点跳到链顶的父亲(这样就保证有答 阅读全文
posted @ 2020-09-05 21:31 尹昱钦 阅读(190) 评论(0) 推荐(0)
摘要:传送门 解题思路 关于两点之间的最短距离的区间操作,很显然是树链剖分。 因为既有区间和还有区间最大值,所以我们建立两个线段树。 然后就是树剖的常规操作了。 AC代码 1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #inc 阅读全文
posted @ 2020-07-12 00:28 尹昱钦 阅读(185) 评论(0) 推荐(0)
摘要:传送门 树链剖分 简单点说,就是把一棵树变成多条链。 这里说的是重链剖分。 在遍历一颗树的时候,我们强制从父亲节点走向儿子时,先走所有儿子中以儿子为根的子树最大的那个儿子。 其他的儿子不管什么顺序都可。 这样就可以把dfs序作为链。 例如上面这棵树,边上的蓝色数字就是遍历顺序。 说一些定义: 重边: 阅读全文
posted @ 2020-07-05 16:16 尹昱钦 阅读(189) 评论(0) 推荐(0)
摘要:传送门 解题思路 唔,我才不要上网课呢 很显然对于每个节点i,必须保证叶子节点到这个点的传送距离相等,才能保证最终答案都是相等,而最少的增加次数一定就是使距离全部变成其中最大的距离。 好吧,解释的不清楚。 如果没听懂,重新用贪心来解释一下。 先想一下最终距离。设最终距离为d。 最终的距离一定就等于叶 阅读全文
posted @ 2020-03-08 10:42 尹昱钦 阅读(221) 评论(0) 推荐(0)
摘要:传送门 解题思路 先明确一下题意,c指的是路灯的编号而不是位置。 然后根据贪心,在从点i去关点j的路灯时,所有经过的路灯都会随手关掉(不耗时间),所以我们可以确定,若i点和j点的路灯已经关闭,那么区间i...j的路灯已经全部关闭,而且关完后,最优策略一定是在点i处或者点j处。 这和上一题就很像了,用 阅读全文
posted @ 2020-02-28 00:13 尹昱钦 阅读(216) 评论(1) 推荐(0)
摘要:传送门 解题思路 观察队形的组成方式可以得出,最后一名加入区间i...j的人要么是在i位置上,要么是在j位置上,所以我们可以用dp[i][j][0]表示区间i...j最后一个加入的人站在i位置上的方案总数,同理,用dp[i][j][1]表示区间i...j最后一个加入的人站在j位置上的方案总数。 然后 阅读全文
posted @ 2020-02-27 23:13 尹昱钦 阅读(139) 评论(0) 推荐(1)
摘要:传送门 解题思路 dp[i][j]表示把区间[i...j]涂成目标颜色的最少步骤。 当s[i]==s[j]时,我们可以发现,在涂第i个格子时,我们可以多涂上一格,将第j格涂上;同理,可以在涂第j个格子时,多图一个格子,把第i格涂上。所以就可以从dp[i+1][j]和dp[i][j-1]转移而来。 对 阅读全文
posted @ 2020-02-24 22:32 尹昱钦 阅读(207) 评论(0) 推荐(0)
摘要:传送门 解题思路 用dp[i][j]表示dp[i][j]能否合成一个数,负无穷表示合不成,否则即为合成的数。 然后枚举k,很显然,如果dp[i][k]==dp[k+1][j],dp[i][j]就可以从前面两个转化过来。 最后对所有的任意长度的区间取一个max。 AC代码 1 #include<ios 阅读全文
posted @ 2020-02-24 22:07 尹昱钦 阅读(305) 评论(0) 推荐(0)
摘要:传送门 解题思路 个人感觉难度应该在蓝题左右 (可能是我太弱了趴) 首先我们知道,那个所谓的头标记和尾标记,在合并区间[l...r]时,n和m是确定了的(即l的头标记和r的尾标记),只差中间的r,所以我们可以枚举k(断点)。 然后我们又可以得出,对于合并区间[l...r],最终得分为(dp[i][k 阅读全文
posted @ 2020-02-24 21:04 尹昱钦 阅读(211) 评论(0) 推荐(0)
摘要:传送门 解题思路 对于整个中序遍历,做一遍区间dp: 枚举区间[l...r]内的所有节点作为根节点,然后计算出得分,若比当前的值要大,同时更新dp值和root[l][r](为了输出先序遍历)。 先序是根左右,所以递归输出就好了。 AC代码 1 #include<iostream> 2 #includ 阅读全文
posted @ 2020-02-24 19:31 尹昱钦 阅读(167) 评论(0) 推荐(0)
摘要:传送门 解题思路 区间dp:一般dp[i][j]表示区间i...j的答案,这个答案可以从某个或某些小区间转移而来。 大部分题的解法就是先枚举做外层循环len,表示区间长度,然后枚举区间左端点i,然后计算出右端点j,然后枚举i到j中的所有断点,根据dp[i][k],dp[k+1][j]计算出dp[i] 阅读全文
posted @ 2020-02-22 18:35 尹昱钦 阅读(197) 评论(0) 推荐(0)
摘要:传送门 解题思路 就是对于每个点,找到左面和右面第一个比它大的点。 单调栈解决。 AC代码 1 #include<iostream> 2 #include<cstdio> 3 #include<stack> 4 using namespace std; 5 const int maxn=100000 阅读全文
posted @ 2020-02-22 17:57 尹昱钦 阅读(221) 评论(0) 推荐(0)
摘要:传送门 解题思路 就是对于每一个奶牛,求右边第一个比它高的位置。 很显然,单调栈。 AC代码 1 #include<iostream> 2 #include<cstdio> 3 #include<stack> 4 using namespace std; 5 const int maxn=10000 阅读全文
posted @ 2020-02-16 17:49 尹昱钦 阅读(222) 评论(0) 推荐(0)