![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
点分治
WerKeyTom_FTD
我是一只来自中山纪念中学高三的oier,请多多指教
展开
-
阴阳
题目大意给定一颗有n个结点的树,每条边的权值为1或-1。问有多少点对(i,j)(注意点对不存在顺序性),满足i到j的最短路径上能找到一个点k,使得i到k的最短路径权值和为0,k到j的最短路径权值和为0。 n<=100000。点分治我们进行点分治。 对于当前的根x,我们统计有多少对经过了x的满足题目要求。 我们可以处理出d[i]表示i到x的权值和,b[i]=1表示i到x路径上可以找到异与i与x的原创 2015-12-28 19:30:25 · 544 阅读 · 0 评论 -
[JZOJ5131][SDOI省队集训2017]距离
题目描述点分治询问拆成四条到根的询问。 bfs一遍,处理出可持久化点分树。 查询直接查。#include<cstdio>#include<algorithm>#include<cmath>#define fo(i,a,b) for(i=a;i<=b;i++)#define fd(i,a,b) for(i=a;i>=b;i--)using namespace std;typedef l原创 2017-06-09 22:18:30 · 410 阅读 · 0 评论 -
[bzoj4860]树的难题
题目大意点分治点剖。 每颗子树按最上面那条边的颜色排序。 顺序扫,同颜色的用一颗线段树,其他也用一颗线段树。 每扫过一个颜色合并一下两颗线段树。 这个方法比单调队列不知道低到哪里去了。#include<cstdio>#include<algorithm>#define max(a,b) (a>b?a:b)#define fo(i,a,b) for(i=a;i<=b;i++)using原创 2017-04-21 15:04:31 · 1485 阅读 · 2 评论 -
颜色树
题目大意树上每个节点均有颜色。 求有多少条路径包含了所有k种颜色。k<=10点分治点分治后处理到根的二进制状态表示包含的颜色。 问题转化成插入若干个二进制数,查询包含某个二进制数的二进制数有多少个。 可以插入O(1)查询O(2^k) 考虑综合插入和查询的复杂度。 设f[A,B]表示有多少二进制数前一半为A后一半包含B。 插入时A是确定的,枚举包含的B,O(2^(k/2)) 查询时B是确原创 2017-04-15 16:59:14 · 633 阅读 · 0 评论 -
树上路径
题目描述给定一颗n个结点的无根树,树上的每个点有一个非负整数点权,定义一条路径的价值为路径上的点权和-路径的点权最大值。 给定参数p,我们想知道,有多少不同的树上简单路径,满足它的价值恰好是p的倍数。 注意:单点算作一个路径;u ≠ v时,(u,v)和(v,u)只算一次。题解随便点分治 同一个分治中心按到根最大值排序,然后维护桶 裸题#include<cstdio>#include<alg原创 2017-04-18 10:43:46 · 647 阅读 · 0 评论 -
[bzoj3451]Tyvj1953 Normal
题目大意点分治过程中每次随机选择分治中心。 求期望复杂度。期望的线性性容易知道可以单独考虑每个点的贡献。 对于x和y,我们考虑y能否给x带来1的贡献,即y是否是x在点分树上的祖先。 那么Y必须是x到y上第一个被选择为分治中心的点。 一条路径上每个点成为第一个被选择的点概率均等,因此贡献为1dis(i,j)\frac{1}{dis(i,j)} 答案就是∑ni=1∑nj=11dis(i,j)\原创 2017-04-07 09:39:30 · 1182 阅读 · 0 评论 -
[hackerrank]Self-Driving Bus
题目大意一颗n个节点的树,现在问有多少对[l,r]满足保留编号[l,r]的点在树上是联通块。 n<=1e5点剖点分治一波 一个联通块要么包含分治中心,要么不包括,后者递归分治处理。 假设分治中心编号为x。用fa表示在树上的父亲(以x为根) 我们找到极大区间[l,r]包含x使得编号[l,r]都出现了。 把合法的左端和右端都提取出来(合法的左端i即[i,x]没有fa会连到i左边,合法右端i即[原创 2017-02-24 22:23:26 · 693 阅读 · 0 评论 -
第K大
题目描述一棵具有n个节点的树,每条边(u,v)有一个边权w(u,v)。定义d(i,j)表示离点i第j近的点的距离,且d(i,1)=0。对于每个点i,给你一个Ki,要对每个点求出d(i,Ki)。点分治二分转为判定性问题。 提前预处理点分治树方便询问即可。#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)u原创 2017-01-12 20:59:57 · 567 阅读 · 0 评论 -
[bzoj4182]Shopping
题目大意有一颗树,每个节点相当于是一种物品,有三个因素价值、价格、个数。 在树上选一个联通块,然后做多重背包,要求每种物品必须选。 求最大价值。点分治我们进行点分治。 对于分治中心,要么在联通块中,要么不在。 不在的情况就是递归继续处理。 在的话,以分治中心为根造一颗树,然后做依赖多重背包。 具体做法是,在dfs序上弄,对于i,选i+1就到i+1,不选直接到i+size[i+1] 现在原创 2016-09-25 12:01:03 · 1148 阅读 · 0 评论 -
异或树
题目大意给出一颗树。 求∑n−1i=1∑nj=i+1(a[i] xor a[j])∗dis(i,j)\sum_{i=1}^{n-1}\sum_{j=i+1}^n(a[i]\ xor\ a[j])*dis(i,j) dis(i,j)表示i到j的最短路。点剖这不用说了,拆位,然后点剖。 因为是有序对其实我们可以搞成无序对然后答案除以2。#include<cstdio>#include<algor原创 2016-05-14 12:48:40 · 1253 阅读 · 0 评论 -
染色
题目大意给定一颗树,每个点默认白色,有两种操作。 把一个点染黑(不保证此时该点为白色) 询问一个点与所有黑点的距离和树剖先把原树转化为有根树。 然后询问一个点u,就是枚举每一个黑点v 然后贡献为d[u]+d[v]-2*d[lca(u,v)] 记录黑点的总个数和深度和,前两项很容易求和,最后一项呢? 我们尝试枚举u到root路径上的每一点w,设size[w]表示w是多少个黑点的祖先。 那原创 2016-04-14 19:30:33 · 656 阅读 · 0 评论 -
[bzoj3784]树上的路径
题目大意给出一颗树,边有边权,输出点对距离前K大。点剖我们先思考如果不是树是序列该怎么做。 显然先按照权值从大到小排序,然后扔进堆中n个点对(i,1),对于点对(i,j)其权值是i到j的距离。 每次从堆中取一个,然后把第二维加1再丢进去(当然要求丢进去的点对合法) 那么这道题点剖以后,对于每一个分治中心得到的序列也从小到大排序,然后丢点对进去。 一个点对的合法性指: 1、点对(i,j)满足原创 2016-03-09 19:13:29 · 1387 阅读 · 0 评论 -
树中点对距离
题目大意在一颗N个结点的树上,统计有多少点对最短距离<=m。(点对不存在顺序性)N<=10000点分治我们选取一个点x作根,那么任何点对都分成两种类型 1、经过x 2、不经过x 我们对经过x的进行统计,对于不经过x的继续在x的子树中分治下去。这就是点分治。 我们处理出每个点的深度,排序后就很容易统计经过x的个数。 不过有可能出现一对点对的lca是y而不是x,然后他们被统计进去了,要在往下分原创 2016-01-02 15:55:01 · 1328 阅读 · 0 评论 -
[2017集训队作业自选题#117]Monkey and Tree
题目大意一颗边权树,给你若干点对(ai,bi)。 找到两对点对i和j,使得dis(ai,aj)+dis(bi,bj)最大。做法先建立点分树。 然后进行点分,对于当前分治中心x,讨论最终点对中两个a路径是否过x。 不过x,递归处理。 过x,求出当前分治联通块每个点到x的距离,然后接下来按一个一个子树处理(一起询问,再一起插入,来保证不在同一个子树),我们把b插入到点分树中,对于点分树一个分治中原创 2017-11-14 12:08:21 · 723 阅读 · 0 评论