摘要: "Link" 同上一题。 阅读全文
posted @ 2019-09-24 16:11 Shiina_Mashiro 阅读(82) 评论(0) 推荐(0) 编辑
摘要: "题目" 1、$a_\le b_i$的在前面。 显然。 2、前面的按$a_i$升序排序。 这样会尽可能地让要等的时间变少。 3、后面的按$b_i$降序排序。 反过来看,跟2一样。 真要严格证明的话交换法吧。 c++ include using namespace std; const int N=1 阅读全文
posted @ 2019-09-24 15:38 Shiina_Mashiro 阅读(138) 评论(0) 推荐(1) 编辑
摘要: "题目" 如果我们最大比对面最大大,那么直接用。 如果我们最小比对面最小大,那么直接用。 否则用我们最小去换对面最大。 c++ include using namespace std; inline int read() { register int x=0; register char c=get 阅读全文
posted @ 2019-09-24 15:15 Shiina_Mashiro 阅读(92) 评论(0) 推荐(0) 编辑
该文被密码保护。 阅读全文
posted @ 2019-09-23 15:20 Shiina_Mashiro 阅读(10) 评论(0) 推荐(0) 编辑
摘要: "题目" 我们开一棵线段树记录某个深度中最大的$dis$。 同时利用dfs序来让每条长链开一个线段树并且保证不重复。 遍历到某个点时,先处理重儿子,然后把自己加入线段树,计算一端为自己另一端在重儿子子树中的答案。 然后处理每个轻儿子,暴力计算一端在该轻儿子所在子树中,另一端在该点已遍历过的子树中的答 阅读全文
posted @ 2019-09-21 10:12 Shiina_Mashiro 阅读(141) 评论(0) 推荐(0) 编辑
摘要: 讲一下长链剖分。 类似于重链剖分,我们将一棵树分成多条重链。 对于每个点,其重儿子(也可以称为长儿子)是到叶子节点距离最远的点。 然后类似于静态链分治,我们在计算某个点的答案时先计算重儿子,然后直接继承重儿子答案,再暴力合并轻儿子答案。 为了实现空间与时间复杂的的降低,我们需要用指针来实现。 长链剖 阅读全文
posted @ 2019-09-21 08:16 Shiina_Mashiro 阅读(175) 评论(0) 推荐(0) 编辑
摘要: "Link" 并查集维护染色模板题。 倒序染色,用并查集维护下一个没有被染色的点。 如果用路径压缩+按秩合并可以做到$O(n\alpha(n))$。 反正复杂度瓶颈在读入上所以基本上都是以某种方式生成数据。 阅读全文
posted @ 2019-09-20 20:46 Shiina_Mashiro 阅读(122) 评论(0) 推荐(0) 编辑
摘要: "题目" 因为原本就是棵树,所以部分边组成的一定是森林,那么连通块个数等于点数减边数。 我们离线操作,把所有询问按$r$排序。 然后从小到大枚举右端点,当右端点从$r 1$扩展到$r$时,我们把所有编号大的一端为$r$的边的另一个端点加入树状数组。 对于右端点为$r$的询问,在树状数组中查询大于等于 阅读全文
posted @ 2019-09-20 19:41 Shiina_Mashiro 阅读(142) 评论(0) 推荐(0) 编辑
摘要: "题目" 建两棵动态开点权值线段树。 一棵以颜色为下标,维护每种颜色出现的最浅深度。 一棵以深度为下标,维护以该深度为最浅深度的颜色有多少种。 然后dfs的时候启发式合并线段树即可。 c++ include define mid ((l+r) 1) define pb push_back using 阅读全文
posted @ 2019-09-20 16:36 Shiina_Mashiro 阅读(134) 评论(0) 推荐(0) 编辑
该文被密码保护。 阅读全文
posted @ 2019-09-19 15:20 Shiina_Mashiro 阅读(19) 评论(2) 推荐(1) 编辑