点分治
Master.Yi
学习他人,提升自己;
提升自己,帮助他人。
展开
-
Codechef Union on Tree【点分树+虚树】
题目描述:nnn个点的树,mmm次询问,每次给出kkk个点(a[i],r[i])(a[i],r[i])(a[i],r[i]),表示点a[i]a[i]a[i]可以保护与它距离不超过r[i]r[i]r[i]的点,输出kkk个点总共可以保护的点数。n,m≤50000,∑k≤500000n,m\le50000,\sum k\le500000n,m≤50000,∑k≤500000题目分析:建虚树,然后更新每个点可以保护的最长距离r[i]r[i]r[i](上下两遍更新)。然后累加每个点在树中与它距离不超过r[原创 2020-05-16 16:54:42 · 184 阅读 · 0 评论 -
Codeforces757G Can Bash Save the Day?【可持久化点分树】
题目描述:给出nnn个点的树和排列pip_ipi,有边权,Q次操作:1 l r x1~l~r~x1 l r x:求∑i=lrdis(pi,x)\sum_{i=l}^rdis(p_i,x)∑i=lrdis(pi,x)2 x2~x2 x:swap(px,px+1)swap(p_x,p_{x+1})swap(px,px+1)n,Q≤200000n,Q\le200000n,Q≤200000题目分析:首先肯定需要原创 2020-05-11 22:23:13 · 210 阅读 · 0 评论 -
模拟赛20200322
T1:LYK loves games对于 100%的数据:n,Q<=10000,0<=任意时刻任意点的点权<32768,点权随机。题解:mine:对每个二进制位分开处理,这样只需要统计有多少路径异或值为1的点对。点分治,在每个点分中心开一个线段树存子树中的点到它的路径异或值为0/1的个数。修改点权时,如果xxx变了,经过xxx的路径都会取反,所以额外维护一个num[...原创 2020-03-25 00:21:21 · 344 阅读 · 0 评论 -
HDU5909 Tree Cutting【树上连通块DP(点分治+dfs序)】
题目描述:树,带点权,连通块的权值为块中点权的异或和,求权值=[0,m)[0,m)[0,m)的连通块的数量。n≤1000,m≤210n\le1000,m\le2^{10}n≤1000,m≤210题目分析:此题可以设f[i][j]f[i][j]f[i][j]表示包含点iii的连通块权值为jjj的数量,合并就用FWT优化,可以做到O(nmlogm)O(nmlogm)O(nmlogm)。连通块...原创 2020-03-05 10:16:56 · 887 阅读 · 0 评论 -
HDU4812 D Tree【点分治(链乘积为k)】
题目描述:树,带点权,求字典序最小的链的两个端点,满足链的乘积=k,乘积 mod 1e6+3.n<=100000题目分析:点分治模板,注意从点分中心下去的一条链也要算(将1装入桶中)。Code:#include<bits/stdc++.h>#define maxn 100005using namespace std;const int mod = 1e6+3;...原创 2020-03-04 10:51:36 · 146 阅读 · 0 评论 -
BZOJ4372: 烁烁的游戏【动态点分治】
题目描述:给一颗n个节点的树,边权均为1,初始点权均为0,m次操作:Q x:询问x的点权。M x d w:将树上与节点x距离不超过d的节点的点权均加上w。n,m<=105,|w|<=104题目分析:每个点分中心维护一个树状数组记录对子树某个距离的加权,再维护一个记录点分树上的父亲由自己这棵子树贡献上去的加权,用于去除重复计算。区间加,单点查即可。写的时候意识到求距离可以...原创 2020-03-03 21:13:38 · 167 阅读 · 0 评论 -
BZOJ3730: 震波【动态点分治】
题目描述:在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i]。接下来你需要在线处理M次操作:0 x k 表示发生了一次地震,震中城市为x,影响范围为k,所有与x距离不超过k的城市都将受到影响,该次地震造成的经济损失为所有受影响城市的价值和。1 x y 表示第x个城市的价值变成了y。为了体现程序的在线性,操作...原创 2020-03-03 19:51:55 · 261 阅读 · 0 评论 -
模拟赛20200229(ay)【max函数分割点、单调队列优化,动态点分治+线段树维护修改边权】
T1:队列题解:Code:#include<bits/stdc++.h>#define maxn 5005using namespace std;int n,w[maxn],f[maxn][maxn],s[maxn],t[maxn],q[maxn][maxn],g;int main(){ freopen("queue.in","r",stdin); freop...原创 2020-03-01 23:15:31 · 200 阅读 · 0 评论 -
模拟赛20200207 Day3
T1:题目描述:题解:n≤20n\le20n≤20的时候可以状压求出每个连通块的点分方案数。然后就自闭了。题解告诉我们,两棵点分树是可以合并的!两棵结构一定的点分树通过一条边连接后可以形成一些新的点分树,方案数与连边的两个点在点分树中的深度有关,并且在新的点分树中原来的两棵树的点分顺序是不变的。画出左链右链,合并的过程有点类似于Treap的merge操作。Code:#incl...原创 2020-02-07 22:21:18 · 131 阅读 · 0 评论 -
BZOJ3451: Tyvj1953 Normal【点分治+FFT】
题目描述:给出树,树上随机选点作重心,求点分治的期望消耗时间。n<=30000题目分析:分开统计每个点,一个点消耗的时间就是它在点分树中的深度。下面的分析来自a_crazy_czy的博客上面的dis(i,j)dis(i,j)dis(i,j)应该改为dis(i,j)+1dis(i,j)+1dis(i,j)+1。FFT时要用整颗子树多项式的平方减去每个儿子子树的多项式平方。每个儿子...原创 2019-09-14 21:50:01 · 184 阅读 · 0 评论 -
BZOJ 2599: [IOI2011]Race【点分治】
题面:给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000题目分析:点分治模板题。解决一个重心的流程大概如下:(假设当前子树的重心为u,解决u子树内的子问题,f[i]f[i]f[i]表示权值为i的最小边数)遍历u的儿子v1,把对应的边数和权值放入栈中(边数>ans或权值>k return),并用...原创 2019-04-05 20:13:40 · 145 阅读 · 0 评论 -
BZOJ 3435: [Wc2014]紫荆花之恋 【(替罪羊树式)"动态"点分治 + Treap】
BZOJ 传送门洛谷传送门题目分析:似乎做过几道点分树的题之后题解还是比较好懂的。这位dalao的题目分析非常的到位,Orz。PoPoQQQ的具体解读也非常的清晰,Orz。Ri+Rj>=dist(i,j)→Ri−dist(i,k)>=dist(k,j)−RjR_i+R_j>=dist(i,j) \rarr R_i-dist(i,k)&g...原创 2019-03-24 13:40:42 · 250 阅读 · 0 评论 -
BZOJ 3924: [Zjoi2015]幻想乡战略游戏 【点分树】
BZOJ传送门洛谷传送门题目分析:要计算所有点到一个点的带权距离和。先考虑如何计算:每次找重心,构造出点分树,对于树中的每个节点维护三个信息:sv[i]sv[i]sv[i]:以iii为根的子树的点权和sd[i]sd[i]sd[i]:以iii为根的子树中每个点到iii的带权距离和sf[i]sf[i]sf[i]:以iii为根的子树中每个点到iii(在点分树中)的父亲的带权距离和查询点...原创 2019-03-20 22:13:07 · 160 阅读 · 0 评论