随笔分类 -  分治--点分治

摘要:根据期望的线性性,答案就是 $\sum$ 每个连通块出现次数的期望 而每个连通块次数的期望就是 $\sum$ 连通块的根与每个点连通次数的期望 也就是对于一条路径 $(i,j)$,设 $i$ 为根,那么 $i$ 必须是这条路径第一个被选择的点,概率为 $\frac{1}{dis(i,j)}$,其中 阅读全文
posted @ 2019-02-15 11:19 Cyhlnj 阅读(170) 评论(0) 推荐(0)
摘要:"传送门" 按照紫荆花之恋的做法,动态维护一下点分树的形态 把点随机打乱 每次从当前的根开始 $explore$,如果已经有了就暴力跳到那个点 否则加入这个点 注意一条链的要单独处理 cpp include include "rts.h" using namespace std; typedef l 阅读全文
posted @ 2019-01-16 21:50 Cyhlnj 阅读(234) 评论(0) 推荐(0)
摘要:"传送门" 暴力思路就是每次点分治计算答案 点分治之后,条件可以变成 $dis_i r_i\le r_j dis_j$ 每次只要查找 $r_j dis_j$ 的排名然后插入 $dis_j r_j$,随便拿个平衡树维护即可 考虑如果带修改,就是动态点分治,每个点维护两个平衡树,一个表示自己的贡献,一个 阅读全文
posted @ 2019-01-16 17:43 Cyhlnj 阅读(249) 评论(0) 推荐(0)
摘要:题面 "传送门" Sol 设$f[i]$表示$i$到根的最小代价 $f[i]$可以由$f[j]$转移而来,要求$j$为$i$的父亲,并且满足距离限制 显然$DP$式可以斜率优化 然而这是在树上,并且每次都要一个$i$往上的若干个点的凸包 可以考虑维护区间凸包,可以用线段树 或者$CDQ$分治 $CD 阅读全文
posted @ 2018-05-31 11:50 Cyhlnj 阅读(165) 评论(0) 推荐(0)
摘要:题意 一棵$n$个点的树,点从$1$到$n$编号。每个点可能有两种颜色:黑或白。 我们定义$dist(a,b)$为点$a$至点$b$路径上的边个数。 一开始所有的点都是黑色的。 要求作以下操作: $0 i$ 将点$i$的颜色反转(黑变白,白变黑) $1 v$ 询问$dist(u,v)$的最小值,$u 阅读全文
posted @ 2018-03-24 11:02 Cyhlnj 阅读(240) 评论(0) 推荐(0)
摘要:题意 "luogu的翻译" 给定一棵n个点的树,树上有m个黑点,求出一条路径,使得这条路径经过的黑点数小于等于k,且路径长度最大 Sol 点分治辣 如果是等于$k$的话,开个桶取$max$就好了 而小于等于$k$,就可以把桶换成树状数组,求前缀$max$ 很慢~~能过~~ cpp include d 阅读全文
posted @ 2018-02-26 19:05 Cyhlnj 阅读(123) 评论(0) 推荐(0)
摘要:题面 "传送门" Sol 先$SPFA$求出单源最短路,$Bfs$建出树,字典序可以用堆解决 然后就是点分治的一眼题 开桶记录到当前根经过边长度相同的最长路,记录它的长度 自己强行$yy$了一个这种类型的点分丑陋写法 cpp include define RG register define IL 阅读全文
posted @ 2018-02-26 14:54 Cyhlnj 阅读(180) 评论(0) 推荐(0)
摘要: 题面 "传送门" Sol 题意就是给你一棵树,有边权 求边数在$[L, U]$内的一条路径,使得边权和除以边数最大,输出这个最大值 二分答案+点分治+单调队列 二分一个答案$mid$,把所有的边权减去这个$mid$就是$check$是否有一条边数满足要求的大于等于零的路径 $bfs$求出当前每个 阅读全文
posted @ 2018-02-25 21:47 Cyhlnj 阅读(132) 评论(0) 推荐(0)
摘要:题目 bzoj权限题。。。 "Luogu" Sol 点分治辣,边权非负,k =1,开个$1e6$的桶就好辣 cpp include define RG register define IL inline define Fill(a, b) memset(a, b, sizeof(a)) using 阅读全文
posted @ 2018-02-25 16:04 Cyhlnj 阅读(131) 评论(0) 推荐(0)
摘要:题面 "戳我" Sol 和 "bzoj震波" 那道题差不多 加上线段树标记永久化就好了 cpp include define RG register define IL inline define Fill(a, b) memset(a, b, sizeof(a)) using namespace 阅读全文
posted @ 2018-01-13 16:34 Cyhlnj 阅读(301) 评论(0) 推荐(0)
摘要:题面 "戳我" Sol 动态点分治: 建个点分树,每个节点开两颗线段树,以与该点的距离为下标,维护价值和 一棵树维护这个点的,一棵维护对上层重心的贡献 然后。。 然后?直接暴力搞就行了 注意常数优化~~我TLE了一遍,第二遍卡过去的~~ cpp include define RG register 阅读全文
posted @ 2018-01-13 15:44 Cyhlnj 阅读(421) 评论(0) 推荐(0)
摘要:Sol 作为一个刚刚学动态点分治的新手,表示这道题很难啃动。。。 既然是动态点分治,那么先建出点分树,之后暴跳父亲就是log的 这道题就是要求带权重心,可以证明,随意在点分树上从一个点出发,每次选最小答案的子重心,最后一定能找到答案。。感觉就相当于在树上二分。。。 修改就爆跳父亲 cpp inclu 阅读全文
posted @ 2018-01-13 07:43 Cyhlnj 阅读(172) 评论(0) 推荐(0)
摘要:简介 这是我自己的一点理解,可能写的不好 点分治都学过吧。。 点分治每次找重心把树重新按重心的深度重建成了一棵新的树,称为分治树 这个树最多有log层。。。 动态点分治:记录下每个重心的上一层重心,这棵分治树就确定了 修改就暴力在分治树中向上改,反正是log的 至于为什么叫动态点分治我不知道。。。我 阅读全文
posted @ 2018-01-12 17:20 Cyhlnj 阅读(259) 评论(4) 推荐(0)
摘要:树分治 求逆元请递推,不然会TLE 开桶记录即可 注意常数 # pragma comment(linker,"/STACK:102400000,102400000") # include <stdio.h> # include <stdlib.h> # include <iostream> # in 阅读全文
posted @ 2017-12-12 19:40 Cyhlnj 阅读(283) 评论(0) 推荐(0)
摘要:树分治,每次把每个点的deep取出,排序。。。尺取法。。。 # include <stdio.h> # include <stdlib.h> # include <iostream> # include <algorithm> # include <string.h> # define IL inl 阅读全文
posted @ 2017-12-12 19:37 Cyhlnj 阅读(148) 评论(0) 推荐(0)
摘要:树分治,每次统计时有两种组合%3==2和%3==1, %3==0和%3==0 乘法原理即可 # include <stdio.h> # include <stdlib.h> # include <iostream> # include <algorithm> # include <string.h> 阅读全文
posted @ 2017-12-12 19:36 Cyhlnj 阅读(147) 评论(0) 推荐(0)