随笔分类 -  图论

摘要:题目链接Miku dfs每个点找环,但是要有一些特殊改造 标记每一个点需要在找完了之后标记 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<stack> using namespac 阅读全文
posted @ 2020-08-28 21:40 Simex 阅读(108) 评论(0) 推荐(0)
摘要:Miku 一眼就看出来是个二分答案 二分最大边的权值 然后显然这种题是不需要考虑花了多少钱的,那么对于每一个mid 就先把所有范围内1级边全键了,然后再把剩下的二级边全键了,看一下能不能跑出来一个生成树 就行了 //二分解决最大的最小 #include<iostream> #include<algo 阅读全文
posted @ 2020-08-11 09:23 Simex 阅读(132) 评论(0) 推荐(0)
摘要:Miku 说出来你们可能不信,这题卡了我一小时 因为没写路径压缩但是我以为我写了+写快读忘了处理负数 哭了 思路就是把所有联通的球放到一个并查集里,然后只要有上下表面的球联通了,就有了答案 #include<iostream> #include<cstdio> #include<algorithm> 阅读全文
posted @ 2020-08-08 18:20 Simex 阅读(87) 评论(0) 推荐(0)
摘要:Miku so crazy 因为把stack的类型写成bool 把自己搞自闭了 思路,显然如果一个点是(,那么不会有贡献,只要压入队列,答案继承父亲就行了 如果是),如果能匹配,就判断(的父亲是什么,如果是),那么显然把根节点到)的父亲的序列中与刚匹配的()相接的部分加上刚匹配的()也是合法的 不考 阅读全文
posted @ 2020-08-07 22:55 Simex 阅读(97) 评论(0) 推荐(0)
摘要:Miku 既然是二分图匹配的模板 为什么不和模板一样是绿的 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct b{ int to; int ne; 阅读全文
posted @ 2020-08-07 22:42 Simex 阅读(177) 评论(0) 推荐(0)
摘要:Miku 第一关键字是温度,那完全可以在保证图联通的前提下找到最大的最小温度 最小生成树 然后把所有比最小温度还小的边建成一个新图,跑最短路就行了 #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #inc 阅读全文
posted @ 2020-08-06 13:31 Simex 阅读(68) 评论(0) 推荐(0)
摘要:本应很简单的东西。。。 Miku #include<iostream> #include<cstdio> #include<algorithm> using namespace std; int u,v; int m; int fr[5001][5001]; int ans[10205]; int 阅读全文
posted @ 2020-08-05 14:19 Simex 阅读(117) 评论(0) 推荐(0)
摘要:Miku [理论](https://www.cnblogs.com/WAMonster/p/10118934.html) 感谢这位神仙帮助我深刻理解了莫队 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> 阅读全文
posted @ 2020-08-03 22:03 Simex 阅读(110) 评论(0) 推荐(0)
摘要:Miku 简单版就是个单纯的模板 ac自动机是啥,就是一个加了类似于kmp的next数组的tire树 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<qu 阅读全文
posted @ 2020-08-03 21:52 Simex 阅读(109) 评论(0) 推荐(0)
摘要:Miku 规律:假如只有一个栈,那么如果原序列存在三个数x<y<Z&&$V_y>V_x>V_z$ 那么就不可能排序成功,但是这里有两个栈,那么就应该把原序列分成两部分 两部分?二分图。 把不能在一起的点连边,进行二分图染色。 如果成功,就意味着存在&&两个栈的成员搞定了 反之不存在 #include 阅读全文
posted @ 2020-08-03 14:16 Simex 阅读(100) 评论(0) 推荐(0)
摘要:Miku 显然思路是倒着扫,倒着染。 然而这样有一个问题,这样做,那么对于已经染色的区间是不需要重新染色的, 但是遍历的时候可以找到已染色区间的一个端点,另一个在哪? 用并查集解决 fa[x]为x右边第一个没染色的端点 然后就O(N)解决了 提示:n+1个点也要初始化,因为只要n点被染色,那么一定指 阅读全文
posted @ 2020-08-02 22:25 Simex 阅读(97) 评论(0) 推荐(0)
摘要:树上差分板子的板子 Miku #include<iostream> #include<cstdio> using namespace std; int head[2*500001]; int p; struct b{ int to; int ne; } e[2*500001]; int fa[2*5 阅读全文
posted @ 2020-08-02 11:54 Simex 阅读(101) 评论(0) 推荐(0)
摘要:树上差分!!! 这是一道模板题的稍微改编 首先,啥是树上差分 就和名字一样,书上的差分 倘若我们要给(u,v)的路径上加上k 则给u+k,v+k,然后lca(u,v)-k(因为事实上lca处就加了一个,可是这么干加了俩) father(lca( ))-k(这里及更高处根本没动过,消除影响) 所以这题 阅读全文
posted @ 2020-08-02 08:27 Simex 阅读(143) 评论(0) 推荐(0)
摘要:链接:Miku 链表存图,但是要注意创造出来个0和n+1号坑,这会方便我们后续处理的 贪心的部分就是选择最高的,然后把两边的去掉 等等,我反悔了咋办,我觉得选两边的更好!(这里有一个问题,要不都选,要不都不选,这是可以证明的) 那么我们就把两边和中间拼成一颗巨树,他的价值是两边之和-中间的(这样再选 阅读全文
posted @ 2020-07-21 18:23 Simex 阅读(153) 评论(0) 推荐(0)
摘要:链接:Miku 这道题的dp还是先更新子节点,在更新父节点,不过问题就是怎样更新他们 我们定义ff[i][j]为第i个节点字数上共保留j条边的情况下最多的苹果数,对于每一个点,他保留的边必然是他直接保留的之前保留的边和他当前儿子保留的边的值的和加上这一条边的 边权,即ff[u][i]=max(ff[ 阅读全文
posted @ 2020-01-20 22:18 Simex 阅读(149) 评论(0) 推荐(0)
摘要:链接:Miku 分组背包,我们只需要在01背包的基础上稍加修改,把同一类的物品同时枚举即可。 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n,m; 阅读全文
posted @ 2020-01-20 21:41 Simex 阅读(192) 评论(0) 推荐(0)
摘要:链接:Miku 很入门的树形dp,首先,在这个题中,我们要做的就是求出来每一个子节点,然后用他们去更新父亲节点。 对于每一个节点,他有两种状态,去,或者不去,我们定义dp[i][0]为第i个节点也去的状态,而dp[i][1]为它不去,那么很显然 如果这个点去了,它的子节点肯定不去,那么dp[i][1 阅读全文
posted @ 2020-01-20 21:34 Simex 阅读(140) 评论(0) 推荐(0)
摘要:链接:Miku 差分约束的可以算是例题吧,这道题我们要建立的约束系统是前缀和,毕竟要求的就是区间的和的最少的 最后,用前缀和求出总区间和就行了 #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #inc 阅读全文
posted @ 2020-01-19 23:19 Simex 阅读(150) 评论(0) 推荐(0)
摘要:链接:Miku 这道题本质上还是一个spfa板子,考虑一下题目的条件,到达一个城市后,肯定会赚到d的钱,那么我们把这个钱视为在路上赚的,然后到达一个城市 立即去下一个城市,其实是等价的,我们就把边权转换成了点权。 再考虑一下飞机,能赚的钱减去机票钱既可以了,是个负数?题目说了可以赊账。 一直赚钱?这 阅读全文
posted @ 2020-01-19 21:50 Simex 阅读(163) 评论(0) 推荐(0)
摘要:链接:Miku 这一道题只需要在倍增lca的板子上改一改就可以了。 宽度和深度可以在倍增lca的dfs预处理的时候判断一下就可以,至于最后问的两点之间的距离 首先需要求出两点公共祖先的位置,然后计算他们深度的差,并且按照题目要求分别处理即可 #include<iostream> #include<c 阅读全文
posted @ 2020-01-19 00:06 Simex 阅读(219) 评论(0) 推荐(0)