随笔分类 - 搜索 DFS/BFS
摘要:北化ACM集训队每周程序设计 7 问题 E: 病毒树 题意:给你一颗$n$个节点的树,有$k$个节点,给每个节点涂色,要求每三个相邻的节点颜色不同,求方案数。 题解:我们dfs这颗树,当遍历到某个节点时,要给这个点涂色,那么这个点不能和他的父亲,以及他左边的同父亲的兄弟,以及父亲的父亲同一个颜色,然
阅读全文
摘要:传送门 A - Blood Pressure 水题 B - Cycle Hit 水题 C - chokudai 题意:给你一个字符串$S$,问你有多少子序列能构成$chokudai$,答案$\mod 1e9+7$. 题解:根据每个连续性,当遍历到某个字符时,状态一定只从它在模板串的上一个字符转移过来
阅读全文
摘要:题意:对区间$[1,n]$建线段树,返回条件是$r-l+1<=k$,问建成的线段树有多少节点. 题解:这题找了半天结论都不对,后来发现可以直接模拟建树过程,对区间长度记忆化,因为区间长度相同,其子节点个数也都是相同的. 代码: #include <bits/stdc++.h> #define ll
阅读全文
摘要:题意:有两个容器$x$和$y$,$n$对数$a[i]$和$b[i]$,每次选一对数将$a[i]$或者$b[i]$放入容器$x$或$y$中,全部放完后将$x$和$y$中所有数求gcd,然后得到的两个数求lcm,问能得到的最大lcm是多少. 题解:这题的$n$给的很小,但是直接dfs肯定是不行的,因为每
阅读全文
摘要:题意:有一颗树,根结点为$1$.$q$个询问,每次问你共有多少经过$u$点且到根节点距离为$d$的点. 题解:这题技巧性好强,我们从根节点遍历整颗树,用时间轴记录搜到和离开的时间$in_i$和$out_i$,同时存入同一深度的所有$in_i$,方便后面计算.对于某个父亲结点$u$,它的一个子树结点为
阅读全文
摘要:题意:有一颗树,你需要从根节点开始bfs,将搜到的点按顺序放入栈中,给你一个序列,你需要判断这个序列是否是某一种栈的情况. 题解:存一下序列中每个值的位置,然后对于每个父亲结点,按照所存每个值的位置对儿子进行排序,最后跑bfs判断即可. 代码: #include <bits/stdc++.h> #d
阅读全文
摘要:题意:有一个$n$x$m$的矩阵,相邻点之间都存在边权,每次可以移动到相邻点,问你每个点移动$k$次后并回到该点的最短边权和. 题解:如果$k$是奇数的话,一定不能走回到自己,因为线段来回来走两次或走一个矩阵,他们的边长和都是偶数.$dp[i][j][k]\(表示点\)(i,j)$走$k$次后回到自
阅读全文
摘要:题意:给你一组数,问你最少能凑多少个LIS和LDS. 题解:能解决的办法好像只有dfs找了,但是我们可以贪心和剪枝来优化,我们来看贪心,当我们遍历到$i$个数时,想要把它加入到前面的某个上升子序列中,那么最优的放法一定是放到末尾数字比$a[i]$小的最大的那个数后面,因为加入放到一个末尾数字很小的子
阅读全文
摘要:题意:有来两个人A和B,A追B,A和B每次向上下左右移动一个单位,一共有两扇门,问A是否可以追上B(在门口追上也算合法). 题解:当时看题意说在门口也算?就觉得是判断两个人到门口的时间,对他们两个人分别跑bfs,记录他们到每个门口的步数,然后if判断一下即可. 代码: #include <bits/
阅读全文
摘要:题意:给你四个数字,你可以用这四个数字凑出四个1位数,一个2位数和两个1位数,或一个3位数和一个1位数,你可以用你凑出的数字进行$+,-,x$运算(所有运算符号至少出现一次),问你一共能得到多少个不同的数字. 题解:dfs瞎搞,不合法乘法的细节特别多,在dfs函数里面用flag和mult来分别去除出
阅读全文
摘要:题意:给你节点数为$n$的树,每个节点都有自己的权值,求所有路径的上的点的权值按位与的和. 题解:题目给的数据很大,我们不能直接去找.因此我们可以枚举二进制$[1,20]$的每一位,然后再枚举所有点,看它二进制对应位置是否满足条件,之后再去dfs找$1$的连通块即可. 代码: const int N
阅读全文
摘要:题意:给你含有$n$个节点,$n-1$条边的树,以及$m$个质数和$1$,你需要在这$m$个质数和一个$1$选择数(质数只能选一次,$1$可以多选)给$n-1$条边赋值,求所有简单路径的边权和. 题解:很简单,对于每条边,我们看它左右有多少个点,右边有多少点,左边点数x右边点数就是包含这条边的简单路
阅读全文
摘要:题意:有一个长度为$n$的数组,你可以从中选一些数出来使得它们的和不大于$t$,问能选出来的最大的和是多少. 题解:$n$的数据范围是$40$,直接二进制枚举贴TLE,之前写过这样的一道题,数据范围也是$40$,我们可以将$40$对半分,用两个数组分别记录$n/2$个数,然后再用两个数组记录它们二进
阅读全文
摘要:题意:给你一张图,$S$表示起点,$G$表示终点,$.$表示可以走,#表示不能走,小写字母可以传送到任意一个相同的字母的位置,问从$S$走到$G$的最小步数. 题解:假如不考虑字母的话,就是一个经典的bfs,当我们走到字母时,将其它相同字母的位置入队,之后就不会再将它们入队了,因为之后走到这个字母的
阅读全文
摘要:题意:有一个$n$个点,$n$条边的图,问你长度至少为$1$的简单路径有多少条. 题解:根据树的性质,我们知道这颗树一定存在一个环,假如一棵树没有环,那么它的所有长度不小于$1$的简单路径数一定是$\frac{n*(n-1)}{2}$,因为每个点都可以和其他任意一个点形成一条路径,除以$2$表示去除
阅读全文
摘要:题意:给你一个$n$个点的完全$k$叉树的先序遍历序列$a$,还原这颗树并且求所有两个端点的异或和. 题解:用dfs在还原树的时候,把子节点和父亲节点的异或贡献给答案,对于每个节点,我们找它所有的子节点(从左到右),如果子节点合法就不断递归求贡献即可. 代码: class Solution { pu
阅读全文
摘要:题意:有一长度为$n$的字符串,要求得到$k$不同的它的子序列(可以是空串),每个子序列有$|n|-|t|$的贡献,求合法情况下的最小贡献. 题解:直接撸个爆搜找出所有子序列然后放到set里面搞一下就好了. 代码: int n,k; string str; set<string> s; queue<
阅读全文
摘要:题意:给你一颗树(边是无向的),从根节点向下走,统计走到每个子节点的概率,求所有叶子节点的深度乘上概率的和. 题解:每层子节点的概率等于上一层节点的概率乘$1$除以这层的子节点数,所以我们用$dfs$或者$bfs$都可以写,其实就是个搜索裸题,注意给的边是无向的就好了. 代码: 1.dfs: int
阅读全文
摘要:题意:有$n$个点,$n-1$条边,每个点的类型是$0$或$1$,现在让你选一个点,然后所有与该点类型不同的点直接消失,问选哪些点之后,该点所在的联通块最大. 题解: 因为选完之后两个类型不同的点之间的边会消失,所以我们可以直接维护一个并查集,每个集合中存的是相同类型的点的连通数量,维护最大值即可.
阅读全文
摘要:Link Cut Centroids Fishing Prince loves trees, and he especially loves trees with only one centroid. The tree is a connected graph without cycles. A v
阅读全文