摘要: read 函数 inline int read() { int x=0,f=1; char c=getchar(); while(c<'0'||c>'9') {if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9') {x=x*10+c-'0'; c= 阅读全文
posted @ 2019-07-24 14:32 handsome_zyc 阅读(633) 评论(0) 推荐(0) 编辑
摘要: Tarjan 模板题 第一问就是缩点之后看有多少个入度为零的点就好了。 第二问是在缩点后将每个点的入度和出度都求出(只要有入度或出度就置为1),然后比较哪个有值的多,将多的作为答案输出。原因是由题可得,要使缩完的点也构成一个强连通分 量,即入度和出度都大于等于1。 阅读全文
posted @ 2019-07-24 14:27 handsome_zyc 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 一道经典的割点例题,用size数组记录该子树有多少个节点,sum是这棵搜索树上有多少个节点,sum*(n-sum-1)是将点删掉后的数对数量。 阅读全文
posted @ 2019-07-24 14:22 handsome_zyc 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 今天学了割点,就A了这道板子,比较难理解的地方就在于如果是根节点就要找两个点来满足low[y]>=dfn[x],如果不是就只需找一个点来满足。Tarjan(i,i)中第一个i是开始搜索的点而第 二个i代表根节点,就是这棵搜索树的根,虽然一开始值是一样的,但x是要随着搜索向下找的,而根节点在搜索过程中 阅读全文
posted @ 2019-07-24 14:21 handsome_zyc 阅读(274) 评论(0) 推荐(0) 编辑
摘要: 今天学了强连通分量的Tarjan算法,做了这道类似于板子题的题(尽管我调了1.5h)。主要的思路是用Tarjan缩点之后,求每个点的入度(实际上是出度,因为我是反着连边的)。如果 有且只有一个点的入度大于零,那个强连通分量里有的点的个数就是答案。具体实现见代码: 阅读全文
posted @ 2019-07-24 14:18 handsome_zyc 阅读(212) 评论(0) 推荐(0) 编辑
摘要: 今天学了网络最大流,EK 和 Dinic 主要就是运用搜索求增广路,Dinic 相当于 EK 的优化,先用bfs求每个点的层数,再用dfs寻找并更新那条路径上的值。 EK 算法 Dinic 算法 阅读全文
posted @ 2019-07-24 14:14 handsome_zyc 阅读(337) 评论(1) 推荐(1) 编辑
摘要: 差分约束系统,维护前缀和,根据式子d[ b ] < = d[ e + 1 ] - t,可以看出要连e和b - 1,但占用了超级源点0,所以要把区间向后移,这样就可以用超级源点0来保持图的连通性(也可 以用n + 1作为超级源点,就不用了后移了) 阅读全文
posted @ 2019-07-24 14:11 handsome_zyc 阅读(370) 评论(0) 推荐(0) 编辑
摘要: 今天学了差分约束系统, 这是一道板子题。 核心:a[v]>a[u]+d 相当于从u到v连一条长度为d的有向边。由于要判断有环,所以要从0点先跑一遍spfa因为1点不一定能到所有的点。 阅读全文
posted @ 2019-07-24 14:07 handsome_zyc 阅读(237) 评论(0) 推荐(0) 编辑
摘要: 挺好的一道题,本身不难,就把求两个点的LCA变为求三个点两两求LCA,不重合的点才是最优解。值得一提的是,最后对答案的处理运用差分的思想:假设两点 一点深度为d1,另一点 深度为d2,它们LCA深度为d3,这二者之间的距离即为d1+d1-2*d3,只要将这两点推广成三点即可。 阅读全文
posted @ 2019-07-24 14:04 handsome_zyc 阅读(184) 评论(0) 推荐(0) 编辑
摘要: 这道题相当于倍增求LCA的板子,我们只要构建一棵树,然后距离就是x的深度+y的深度 - LCA(x,y)的深度; 阅读全文
posted @ 2019-07-24 13:58 handsome_zyc 阅读(110) 评论(0) 推荐(0) 编辑
摘要: 这道题是我们考试的第一题,非常水,就是一个树的直径的板子。详见上一篇博客。 阅读全文
posted @ 2019-07-24 13:56 handsome_zyc 阅读(397) 评论(2) 推荐(0) 编辑
摘要: ① 两次dfs 方法:先从任意一点P出发,找离它最远的点Q,再从点Q出发,找离它最远的点W,W到Q的距离就是是的直径 证明如下: ①若P已经在直径上,根据树的直径的定义可知Q也在直径上且为直径的一个端点 ②若P不在直径上,我们用反证法,假设此时WQ不是直径,AB是直径 >若AB与PQ有交点C,由于P 阅读全文
posted @ 2019-07-24 13:53 handsome_zyc 阅读(11876) 评论(2) 推荐(2) 编辑
摘要: 思路: 首先先将每个输入的数据与n的最大公约数求出(因为如果a[i]是密码,那么所有a[i]与n最大公约数的倍数也是密码;于是如果a[i]不是密码,那么所有a[i]与n最大公约数的倍数也都不是密码)再从1到sqrt(a[k])(其实1到a[k]也行)找,最小且符合条件就是最小密码。 阅读全文
posted @ 2019-07-24 13:42 handsome_zyc 阅读(271) 评论(0) 推荐(0) 编辑
摘要: 一道经典的BFS 用四个for搜索四位就行了,只要能推出怎么只变4位中的一位就很水了 阅读全文
posted @ 2019-07-24 13:34 handsome_zyc 阅读(246) 评论(0) 推荐(0) 编辑
摘要: 深搜,只不过是三维的。 阅读全文
posted @ 2019-07-24 13:30 handsome_zyc 阅读(240) 评论(0) 推荐(0) 编辑
摘要: 深搜,向四个方向,在不越界的情况下一直闷头走,直到撞墙。到达终点就输出,没到就回溯。 阅读全文
posted @ 2019-07-24 13:28 handsome_zyc 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 思路 dfs(只不过要用邻接表存)邻接表是由表头结点和表结点两部分组成,其中表头结点存储图的各顶点,表结点用单向链表存储表头结点所对应顶点的相邻顶点(也就是表示了图的边)。在有向图里表示表头结点指向其它结点(a->b),无向图则表示与表头结点相邻的所有结点(a—b) 阅读全文
posted @ 2019-07-24 13:24 handsome_zyc 阅读(247) 评论(0) 推荐(0) 编辑
摘要: 我个人感觉就是一道bfs的变形,还是对bfs掌握不好的人有一定难度。 本题思路: 大体上用bfs搜,用map来去重,在这里只需要一个队列,因为需要较少步数达到的状态一定在步数较多的状态之前入队列。 阅读全文
posted @ 2019-07-24 13:18 handsome_zyc 阅读(286) 评论(0) 推荐(0) 编辑
摘要: 这道题其实是一道01背包的变形题,主要思路如下:在不把剩余时间用光的前提下(剩余时间>0),尽可能的多唱歌。于是我们可以用dp[i]表示的是到当前i秒时,最多可以唱多少歌。 状态转换方程:dp[k]=max(dp[k],dp[k-yy]+1);最后输出可以唱多少歌。 阅读全文
posted @ 2019-07-24 13:11 handsome_zyc 阅读(215) 评论(0) 推荐(0) 编辑