摘要: 传送门 "Luogu" 解题思路 ~~离散化没什么好说~~ 有一种暴力的想法就是枚举每一个坟墓,用一些数据结构维护一下这个店向左,向右,向上,向下的常青树的个数,然后用组合数统计方案。 但是网格图边长就有 $1e9$ 级别,于是这种方法就萎了。 考虑从常青树下手。 我们可以发现在同一竖排中的两颗相邻 阅读全文
posted @ 2019-10-26 22:36 Sangber 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 传送门 "Luogu" 解题思路 对于选出的区间,我们可以直接用线段树维护区间内单点被覆盖次数最大值。 那么解题重心便落在了选取方式上。 为了让最大值最小,考虑尺取,不能二分,降低效率而且不好写。 先将区间按长度从小到大排序,一个一个选入直到满足单点被覆盖 $m$ 次的要求,满足不了就直接 ,然后再 阅读全文
posted @ 2019-10-26 22:35 Sangber 阅读(154) 评论(0) 推荐(0) 编辑
摘要: 传送门 "Luogu" 解题思路 发现一个性质: 对于排列的任何一个循环位移,排列中的同一个数的前驱肯定是不变的。 而且,如果一个排列的循环位移是某一个区间的子序列,那么这个循环位移的结尾的 $n 1$ 级前驱一定要位于这个区间内。 到这里我们就可以倍增维护 $2^k$ 级祖先,然后再搞一个数据结构 阅读全文
posted @ 2019-10-26 22:34 Sangber 阅读(243) 评论(0) 推荐(0) 编辑
摘要: 传送门 "memset0好评" 解题思路 比较恶心的一道数据结构题 看一眼题面,马上想到离散化。 然后将一维排序,另一维用树状数组或者线段树维护。 ~~然后就没思路了~~ 发现一个性质: 不包含所有的颜色,当然要使得只有一种不被选的颜色。 那么我们可以对每一种颜色开一个 $\text{set}$ , 阅读全文
posted @ 2019-10-26 22:33 Sangber 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 传送门 "Luogu" 解题思路 ~~带权并查集我不会啊~~ 考虑种类并查集(扩展域并查集的一种)。 开三倍空间,一倍维护本身,二倍维护猎物,三倍维护天敌,然后用并查集搞一搞就好了。 细节注意事项 + 咕咕咕 参考代码 cpp include using namespace std; const i 阅读全文
posted @ 2019-10-26 22:31 Sangber 阅读(178) 评论(0) 推荐(0) 编辑
摘要: 传送门 "Luogu" 解题思路 很容易想到用一个堆去维护,但是复杂度是 $O((n+m)\log(n+m))$ 的,显然过不了 $7e6$。 其实这题有一个性质: 先被切开的蚯蚓,得到的两条新蚯蚓,一定会比后被切开的蚯蚓长。 这个可以推一下表达式,我就不打了。 那么也就是说,我们需要维护三个队列, 阅读全文
posted @ 2019-10-26 22:30 Sangber 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 传送门 "Luogu" 解题思路 很容易想到平衡树,然后还可以顺便维护一下连通性,但是如何合并两棵平衡树? 我们采用一种类似于启发式合并的思想,将根节点siz较小的那颗平衡树暴力的合并到另一颗上去。 那么复杂度呢? 由于一个点所在的平衡树在经过这样一次合并之后,根节点的siz至少乘2,所以每一次合并 阅读全文
posted @ 2019-10-26 22:29 Sangber 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 传送门 "Luogu" 解题思路 树形背包。 设 $f[i][j][0/1]$ 表示在以 $i$ 为根的子树中选 $j$ 件商品的最少花费。 边界条件: $f[i][j][0] = \min\limits_{0\le k\le siz[son]}\left\{f[i][j k][0]+f[son][ 阅读全文
posted @ 2019-10-26 22:27 Sangber 阅读(166) 评论(0) 推荐(0) 编辑
摘要: 传送门 "Luogu" 解题思路 比较显然的一种做法: 我们把一个点的子树高度抠出来并排序记为 $L_i$,找到最大的 $i$ 使得 $L_{i 1}+L_i\le K$。 于是我们把前 $i$ 个对应的子树中的叶子合并为一个集合,之后的单独为一个集合,从非叶子跑一遍 $\text{DFS}$ 就可 阅读全文
posted @ 2019-10-26 22:25 Sangber 阅读(153) 评论(0) 推荐(0) 编辑
摘要: 传送门 "Luogu" 解题思路 注意到 $m n \le 20$ ,所以这其实是一个树上问题,非树边至多只有21条,那么我们就可以暴力地对每一个非树边所连接的点求一次单源最短路,然后每次询问时,先访问两点的树上距离,再尝试用非树边更新答案,取最小值输出即可。 细节注意事项 + 最短路不要写挂就好 阅读全文
posted @ 2019-10-26 22:24 Sangber 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 传送门 "Luogu" 解题思路 显然的贪心策略,因为每次都要尽量使得删点后的收益最大。 我们可以求出树的直径(因为树上的任意一个节点与其距离最远的点一定是直径的端点)。 然后我们对于所有不是直径上的点,从叶子开始,从下往上删点,最后再由深而浅删掉直径。 最后输出答案即可。 细节注意事项 + 有些地 阅读全文
posted @ 2019-10-26 22:22 Sangber 阅读(157) 评论(0) 推荐(0) 编辑
摘要: 传送门 "Luogu" 解题思路 这是一道 $O(n^2)$ 暴力加上 $\text{random_shuffle}$ 优化 ~~什么鬼~~ 就可以 $\text{AC}$ 的题。 但还是要讲一下 $O(n)$ 的正解。 算了我不讲了~~咕咕咕~~,可以去 "这里" 细节注意事项 + 有点难想,但是 阅读全文
posted @ 2019-10-26 22:19 Sangber 阅读(143) 评论(0) 推荐(0) 编辑
摘要: 传送门 "Luogu" 解题思路 一眼想到二分图:但是求不了最大匹配方案数 oho。 于是考虑这么建图: 直接将一个人可以去的两把椅子连边,然后原图中的2n个点就会形成许多联通块,这个可以分步计数。 又因为每个联通块只会是一棵树或是环套树,所以分类讨论一个联通块内如何计数: + 若该联通块是一棵树( 阅读全文
posted @ 2019-10-26 22:16 Sangber 阅读(116) 评论(0) 推荐(0) 编辑
摘要: 传送门 "Luogu" 解题思路 首先对于树的情况,我们很显然有一种贪心策略: 对于每一个节点先匹配子树,然后在还可以匹配的儿子间尽可能匹配,要是多出来一个就往上匹配。 推广到图的情况。。。 我们在图的生成树上 $\text{DFS}$ ,即时删边,防止重复访问。 然后记录一个 $f[x]$,表示直 阅读全文
posted @ 2019-10-26 22:11 Sangber 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 传送门 "Luogu" 解题思路 首先我们要发现:在同一个强连通分量里的所有边都是可以无限走的。 那么我们就有了思路:先缩点,再跑拓扑排序。 那么问题就是 $\text{DP}$ 状态如何初始化。 我们首先考虑一条原始边权为 $c$ 的边,无限走可以刷出多少贡献: 假设我们走 $t$ 次就可以把这条 阅读全文
posted @ 2019-10-26 22:09 Sangber 阅读(189) 评论(0) 推荐(0) 编辑
摘要: 传送门 "Luogu" 解题思路 一眼先二分(上界树的直径,下界最小边权),然后再考虑 $\text{DP}$。 对于当前节点 $u$,在它的所有儿子中分别返回一条匹配不完的长度最大的路径 $Max$。 若该路径长大于二分值,直接修一条,不然丢进 $\text{multiset}$ 里面。 对于 $ 阅读全文
posted @ 2019-10-26 22:06 Sangber 阅读(251) 评论(0) 推荐(0) 编辑
摘要: 传送门 "Luogu团队题链接" 解题思路 首先二分答案,然后在所有边权小于二分值的边和所有点组成的图中判欧拉回路。 由于可能出现混合图,所以要用到网络流。 把所有无向边钦定一个方向,那么原图就是一个有向图。 那么存在欧拉回路的充要条件就所有点的入度等于出度且图联通。 我们考虑把点 $x$ 的入度与 阅读全文
posted @ 2019-10-26 22:04 Sangber 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 传送门 "Luogu" 解题思路 首先对于所有不属于任何一条路径上的边,它的权值是任意的。 对于所有在路径上的边 $(u,v)$ 满足 $1\le dis_v dis_u\le2$ 差分约束即可。 细节注意事项 + 用dfs判负环时注意一下时间效率 参考代码 cpp include include 阅读全文
posted @ 2019-10-26 22:01 Sangber 阅读(138) 评论(0) 推荐(0) 编辑
摘要: 传送门 "Luogu" 解题思路 考虑最小生成树的几个性质: + 所有最小生成树中边权相等的边的条数相等 + 在任意一颗最小生成树中,边权相等的边所联通的点集一定 那么我们考虑把边权相等的边单独拿出来考虑。 每次把并查集恢复到加边前的状态,然后再判断这些边加进去会不会形成环即可。 PS. 恢复并查集 阅读全文
posted @ 2019-10-26 21:58 Sangber 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 传送门 "Luogu" 解题思路 首先 $\text{Kruskal}$ 一下,构造出一棵森林。 并查集还要用来判断连通性。 倍增 $\text{LCA}$ 的时候顺便维护一下路径最小值即可。 细节注意事项 + 代码稍微有点长,不要出小问题 参考代码 cpp include include usin 阅读全文
posted @ 2019-10-26 21:56 Sangber 阅读(179) 评论(0) 推荐(0) 编辑