![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
dfs
timidcatt
永远不要放弃战斗
展开
-
Tree Cutting Codeforces Round 936 (Div. 2) 1946C
那么很容易想到的就是进行dfs,后序维护当前点u的子树大小siz[u],如果siz[u]>=x,那么这个点和它父节点之间的边就要断掉,使用的边的数量tot+1,然后令siz[u]=0,使其不影响后序的dfs过程,但如果当前点时根节点也就是1号点,它没有父节点,所以tot不能+1,而且如果以1为根的子树的大小=x。那么接下来考虑在确定了某个x的情况下求需要移除的最少边数,因为按照上面的单调性,移除的边数越少x越大。原创 2024-03-25 11:36:42 · 322 阅读 · 0 评论 -
Tree Compass Codeforces Round 934 (Div. 2) 1944E
我们操作4 1 、4 3、5 1、5 3,只需要4次,如果只操作一个中点就需要5次,少一次的原因是我们每次操作都涂黑了至少2个点,只操作一个中点 的话必然会有只涂黑一个点的操作,而要想每次操作都涂黑至少两个点也需要直径的点数是4的倍数,这样才能两个中点交叉操作,所以只需要分两类讨论即可。思路:要想操作数最少,就要使每次操作涂黑的点的数量尽可能多,那么也就是要找这棵树的中心点,而这样的点一定在树的直径上,也就是树上的最长链,直径可以通过两次bfs找最远点或者一次树上dp来找,这里只讲树上dp做法。原创 2024-03-21 11:07:00 · 489 阅读 · 0 评论 -
H. Mad City Codeforces Round 898 (Div. 4)
所以我们先跑一个dfs找到所有环上的点,然后再以b为起点,找到b距离环上的哪个点最近,且是哪个点,然后再从a出发跑bfs找到b到那个点的距离,如果b一开始就在环上且到那个点比a更近,就有必胜策略,同时如果ab重合一定没有必胜策略。题目大意:有一个n个点的图,有n条边,西安有两个人A,B分别位于点a/b,每轮两个人同时开始向相邻点移动,问B有没有可能永远不和A汇合。思路:如果要永远不汇合,那么他们最终肯定在一个环里,而边的数量等于点数,说明图中有且只有一个环,那么B只要比A先到这个环即可。原创 2023-10-19 15:39:49 · 156 阅读 · 0 评论 -
UVA - 10765 Doves and bombs
思路:也就是求每一个割点出现在几个双联通分量(没有割点的图)中,找双连通分量也是用tarjan,dfn[u]表示u是第几个遍历到的点,low[u]表示从u出发在不经过父子边的情况下能到达的最早的祖先的dfn值,而如果一个点是割点,那么在不经过该点的情况下无法到达该点的祖先也就是low[v]>=dfn[u],注意特判起始点的情况,它可能是假割点。题目大意:有一个n个点的图,求每个点如果被删除后,图中剩余连通块的数量。原创 2023-10-06 22:13:57 · 160 阅读 · 0 评论 -
UVa11324 - The Largest Clique
思路:根据建新图的规则可知,一个点会和它能到达的所有点构成一个合法的分量,那么从入度为0的点开始组成的这样一个分量一定是最大的,但是因为图中有环,所以没法直接统计这样的分量的大小,所以要先用tarjan将所有强量通分量缩成一个点,再在新图中用记忆化搜索找上述的分量。题目大意:有一张n个点m条边的图,现对于每一个点u,建立一条边连接它和所有它能到达的点,问满足所有点之间都有边的分量的大小最大是多少。原创 2023-10-05 23:16:30 · 116 阅读 · 0 评论 -
D. Cyclic Operations Codeforces Round 897 (Div. 2)
,要将a[2]修改成3,k就等于[2,3,?我们先按顺序操作[1,2,3],[3,5,4],使位置1,2,3,5上的数都修改完毕,要让位置4上的数也修改好,只能是[4,2,3],这是会把3修改成4,而我们要的是5,要把3改回去,就要操作[3,5,4],第4个位置又不行了,所以这样的环永远会出现错误覆盖的情况。但环的大小小于k时,例如1,2互向指向自己,那k=3时的操作就只能是[1,2,1],后面填别的数都会错误的覆盖掉其他位置,而这样又与b种数字不能重复矛盾,所以这样的话也没法修改好。原创 2023-09-12 15:08:15 · 536 阅读 · 0 评论 -
F. Selling a Menagerie Codeforces Round 895 (Div. 3)
题目大意:有n个动物,每个动物i有一个害怕的动物a[i],现要卖掉所有动物,每个动物都有价值c[i],如果i在a[i]之前卖掉,就会获得2*c[i]的价值,如果在a[i]之后被卖掉就会获得c[i]的价值,问以什么顺序卖掉所有动物能使获得的总价值最高。思路:对于这种约束问题,首先直接从i向a[i]建单向边,初始状态下,所有没有入边的点卖掉都能获得2*c[i]的价值,同时因为该点被删除,所以他们指向的点入度-1,接着卖掉入度为0的点,依次循环,最后一定会出现剩下的点都成环的情况。原创 2023-09-08 11:28:16 · 372 阅读 · 0 评论 -
L. Puzzle: Sashigane The 13th Shandong ICPC Provincial Collegiate Programming Contest
我们不妨从最小的部分开始考虑,我们围绕黑格,加一个长度为1的L即可构造一个2*2的正方形,然后再加两个长度为2的L就可以构造出一个4*4的正方形,以此类推,最终就能得到n*n的正方形。题目大意:有一个n*n的方格网,其中有一个黑格位于第x行第y列,其余格子都是白格,要求用任意个L型填满白格,输出每个L的拐点坐标和延伸长度。思路:我们多模拟一下就可以发现,构造的方案是肯定存在的,只需考虑一种通法。不同颜色代表dfs到不同深度时构造出的L。原创 2023-09-02 18:13:05 · 249 阅读 · 0 评论 -
Shortest path 2023“钉耙编程”中国大学生算法设计超级联赛(9) hdu7372
思路:记忆化搜索,我们从n开始dfs,因为/2或/3肯定比-1好,所以我们就有两种选择,设当前数字为x,要么x/=3,然后操作数+=1+n%3,或者x/=2,然后操作数+=1+n%2,两种方法得到的最小值即为1到x所需的最小操作数,递归直到得到1到n的最小操作数。题目大意:给出一个数n,有3种操作,可以乘以2或乘以3或+1,问最少需要多少步能从1到n。原创 2023-08-15 20:01:00 · 103 阅读 · 0 评论 -
E1. PermuTree (easy version) Codeforces Round 890 (Div. 2) E1
那么问题就转变成了有x个数(x为子链数),怎样将这x个数分成两部分,使得一部分的和*另一部分的和最大,因为和最大是5000,所以我们可以用类似01背包的方法,求出所有能凑出来的和,即将所有所有链长存入数组q中,数组occ记录哪些和出现过,对于q[i],我们从5000到0枚举j,如果occ[j]=1,那么occ[j+q[i]]也为1,之所以要倒推就是因为一个数只能取一次,不能重复取,然后从1到sum(子节点总数)遍历i,如果occ[i]=1,就维护i*(sum-i)的最大值。原创 2023-08-09 15:49:59 · 268 阅读 · 0 评论 -
H. HEX-A-GONE Trails 2023“钉耙编程”中国大学生算法设计超级联赛(7)hdu7354
然后我们还要求从关键路径上每个点出发的所有链的长度,每移动一个节点,所有从起点出发的链的长度都要-1,但其实可以数学一下,我们求出两个起点出发所有链的长度d1,d2,然后假如A从起点移动了一格,到了编号为i1的点,那么再判断时我们只需要判断dis[i1]+1与从B的起点出发所有链的长度即可,省去了全部-1的操作,我们用st表求最大值即可。我们按照此策略循环,看谁先找到最优策略,或者两个人汇合时,谁不能继续走。从2出发的所有链,就能必胜,此图已不存在此情况。原创 2023-08-08 20:59:06 · 191 阅读 · 3 评论 -
Red and Blue and Green 2023牛客暑期多校训练营5 E
如果当前区间不是叶子结点,那么就找两个相邻子区间,交换左区间的最大值和右区间的最小值,这里我们为了方便找最值,只需在下标数组上进行交换操作,即pos[i]表示排列中数字i应该在的位置,这样每次都是交换左区间的右端点和右区间的左端点,最后再令答案排列p[pos[i]]=i即可。题目大意:给出m个互补包含和重合的区间约束,表示[l[i],r[i]]内有偶数/奇数个逆序对,求一个满足所有约束条件长度为n的排列,或输出不能。原创 2023-08-02 23:33:01 · 371 阅读 · 0 评论 -
Cheeeeen the Cute Cat 2023牛客暑期多校训练营5 C
1-2-3-4-1构成一个4个点的环,他们的匹配分别为1-6,2-7,3-8,4-5,然后我们发现建出的有向图一定是竞赛题(即去掉方向后变成完全图的图),竞赛图一定存在一条哈密顿通路(即从一个点出发,能不重复的经过所有点),哈密顿通路的路径长度也是最大匹配,如下图中哈密顿通路为1-2-3-4,匹配为1-6,2-7,3-8,所以答案至少是n-1。原创 2023-08-01 00:27:54 · 209 阅读 · 0 评论 -
Merge the squares! 2023牛客暑期多校训练营4-H
思路:对于一个a*b(a>b)的矩形,我们可以用类似黄金分割的办法将其分割成cnt个b*b的正方形,然后剩下一个(a-cnt)*b*b的矩形,继续分割,一定能最后分割到剩下的矩形边长为1的情况,所以我们将一开始的大正方形分割成左上、右下两个边长分别为a,b的正方形,和剩下两个a*b的矩形,就可以完成题目要求。题目大意:有n*n个边长为1的小正方形摆放在边长为n的大正方形中,每次可以选择不超过50个正方形,将其合并为一个更大的正方形,求一种可行的操作使所有小正方形都被合并成一个n*n的大正方形。原创 2023-07-29 14:35:27 · 538 阅读 · 0 评论 -
City Upgrading hdu7279
题目大意:有一棵n个点的树,每个点的费用为ai,每个点可以覆盖到它本身和其相邻点,要求覆盖所有点,求最小花费。原创 2023-07-18 20:40:10 · 265 阅读 · 0 评论 -
D2. LuoTianyi and the Floating Islands (Hard Version)
当n为偶数时,同理也只有中间两个点之间的这些点满足条件,如果在这些点中挪动,那么到k/2个点的距离分别+1,到另k/2个点的距离分别-1,总距离不变,如果移出这个范围,到k/2+1个点的距离会分别+1,到k/2-1个点的距离会分别-1,所以总距离+1,所以对于每一个点,可行点数v就是一半子树放k/2个点,另一半子树放k/2个点,等于C(k/2,子树大小)*C(k/2,另一边的子树大小)总的放点t的方案数是C(k,n),然后因为我们遍历时是左闭右开的遍历,所以答案是1+v/t。原创 2023-06-01 18:20:14 · 71 阅读 · 0 评论 -
D. Game on Axis codeforces1787D
然后我们发现,如果在不做任何修改的情况下就能从1到终点,非法的方案数是很容易统计的,在从1到终点的这条路径上,对于每一个点,将指向终点方向的那条边指向自己或前驱节点,就会构成环,无法到达终点,同时在图中除了终点和1号点构成的树,还有其他的含环的连通分量,连接这些连通分量中的任意点也无法到达终点,所以要求出路径上每个点的前驱节点,在反向建边的情况下,就是求子节点数,用dfs即可简单求出,其他连通分量的点数就用n-树的大小即可。原创 2023-02-01 17:29:43 · 148 阅读 · 0 评论 -
2022CCPC绵阳 C. Catch You Catch Me codeforces104065C
思路:因为要拿的次数最少,所以我们应该每次拿的蝴蝶数量尽量多,而每只蝴蝶都是从下往上凑的,所以更浅的节点的蝴蝶数更多,所以我们应该从最浅的也就是1的子节点拿,而对于每个子节点拿的次数也就等于子树的最大深度,所以我们先dfs求出每个点从下到上的深度,然后累加1的子节点的深度。题目大意:有一棵以1为根节点有n个节点的树,除了根以外每个点都有一个蝴蝶,每分钟沿着向树根的简单路径走过一条边,每分钟可以任选捕获任意数量的点中的所有蝴蝶,要求不能让任意一只蝴蝶到达根节点,问最少要捕获几次。原创 2022-11-23 19:44:19 · 470 阅读 · 1 评论 -
Another Crisis UVA - 12186
思路:从下向上遍历,对于每个节点,将它的子节点按照该子节点所在的子树中已选择的节点数从小到大排序,然后依次选择前T%个子节点,这样从下向上dp,最终在整棵树中选择的节点数一定是最少的。题目大意:从根节点开始,需要选择每个节点的至少T%个子节点,问在整棵树中最少选择多少个节点。原创 2022-11-04 18:02:07 · 72 阅读 · 0 评论 -
Digital Path 计蒜客 - 42397
Digital Path - 题库 - 计蒜客题目大意:有一个写满数字的n*m矩阵,要从矩阵中找到长度至少为4的公差为1的等差数列,且只能通过上下左右四条边连接,问能找到多少个这样的数列思路:dfs搜图通过记忆化搜索的方式来优化,首先要找到起点,对于在矩阵内的点,我们判断他四个方向有没有比它小1的格子,有的话就不是起点,其次每dfs遍历一个点,就做上标记,不遍历重复的点,然后用三维数组c[i][j][cnt],来记录从i,j开始向后搜索cnt的长度能找到几个数列,cnt大于4的统一记成4,在dfs遍历时,对原创 2022-07-22 19:24:40 · 339 阅读 · 0 评论