bzoj 2870 最长道路tree——边分治】的更多相关文章

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2870 关于边分治:https://www.cnblogs.com/Khada-Jhin/p/10154994.html 自己写了那种把一个孩子连向自己,其他孩子连新建节点的重构图方法. 如果 vector 里最后一个元素恰好是父亲的话,末尾就会有一个新建节点只有一个孩子. solve( ) 完之后要继续 get_rt( ) ,想知道两边的点数 ts :可以发现 to[ cr ] 的部分点数…
挺好的一道题. 把所有点都离线下来,一个个往里加入就行了. #include <cstdio> #include <algorithm> #define N 100003 #define ll long long #define setIO(s) freopen(s".in","r",stdin) using namespace std; int n,val[N]; namespace tree { int edges; int hd[N],…
[BZOJ2870]最长道路tree Description H城很大,有N个路口(从1到N编号),路口之间有N-1边,使得任意两个路口都能互相到达,这些道路的长度我们视作一样.每个路口都有很多车辆来往,所以每个路口i都有一个拥挤程度v[i],我们认为从路口s走到路口t的痛苦程度为s到t的路径上拥挤程度的最小值,乘上这条路径上的路口个数所得的积.现在请你求出痛苦程度最大的一条路径,你只需输出这个痛苦程度. 简化版描述: 给定一棵N个点的树,求树上一条链使得链的长度乘链上所有点中的最小权值所得的积…
简化版描述: 给定一棵N个点的树,求树上一条链使得链的长度乘链上所有点中的最小权值所得的积最大. 其中链长度定义为链上点的个数.   有几个不同的做法: 1.sort+并查集+树的直径.边从大到小加入,并查集维护连通块,记录连通块的直径的两个端点,合并连通块的时候更新直径,并且用len*bian[i].w更新答案 有排序,O(nlogn) 2.点分治+树状数组.点分治路径合并的时候挺恶心.先都扫一遍所有子树,把路径最小值作为下标,链长作为权值放进树状数组里. 再枚举子树搜一遍,先减去当前子树的贡…
链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2870 思路 先把树转化为二叉树 再链分治 %%yyb 代码 #include <iostream> #include <algorithm> #include <cstring> #include <utility> #include <cstdio> #include <vector> #define ll long long…
[BZOJ2870]最长道路(边分治) 题面 BZOJ权限题 Description H城很大,有N个路口(从1到N编号),路口之间有N-1边,使得任意两个路口都能互相到达,这些道路的长度我们视作一样.每个路口都有很多车辆来往,所以每个路口i都有一个拥挤程度v[i],我们认为从路口s走到路口t的痛苦程度为s到t的路径上拥挤程度的最小值,乘上这条路径上的路口个数所得的积.现在请你求出痛苦程度最大的一条路径,你只需输出这个痛苦程度. 简化版描述: 给定一棵N个点的树,求树上一条链使得链的长度乘链上所…
最长道路tree Description H城很大,有N个路口(从1到N编号),路口之间有N-1边,使得任意两个路口都能互相到达,这些道路的长度我们视作一样.每个路口都有很多车辆来往,所以每个路口i都有一个拥挤程度v[i],我们认为从路口s走到路口t的痛苦程度为s到t的路径上拥挤程度的最小值,乘上这条路径上的路口个数所得的积.现在请你求出痛苦程度最大的一条路径,你只需输出这个痛苦程度. Simple Description 给定一棵N个点的树,求树上一条链使得链的长度乘链上所有点中的最小权值所得…
题目 边分治 边分和点分相比就是找到一条重心边,考虑所有经过这条边的路径,之后断开这条边分成两个联通块,继续分治 由于每次分治重心是一条边,所以只会产生两个联通块,考虑两个联通块显然要比像点分那样考虑多个联通块容易 但是边分有一个问题,就是遇到菊花图就自闭了,复杂度变成了\(O(n^2)\) 我们注意到边分的复杂度还和每个点的度数有关系,于是我们建一些虚点和虚边,把这棵树变成一棵二叉树,这样复杂度就是\(O(n\operatorname{logn})\)了 具体做法就是,一旦发现一个节点有多与两…
算法一:点分治+线段树 分析 说是线段树,但是其实要写树状数组卡常. 代码 #include <bits/stdc++.h> #define rin(i,a,b) for(register int i=(a);i<=(b);++i) #define irin(i,a,b) for(register int i=(a);i>=(b);--i) #define trav(i,a) for(register int i=head[a];i;i=e[i].nxt) #define lowb…
题解: 子树分治的做法可以戳这里:http://blog.csdn.net/iamzky/article/details/41120733 可是码量... 这里介绍另一种好写又快的方法. 我们还是一颗一颗子树处理,处理完一个子树,考虑枚举最小值. 如果我们现在处理到了x节点,它到根的min为w. 那么我们就可以在以前的信息中找出min>=w且长度最长的一条链并且用它和该链合并,同时更新答案.这个显然可以用树状数组搞. 处理完一颗子树之后就全部把它加到树状数组里. 于是就O(nlog^2 n)了.…
题目描述 给定一棵N个点的树,求树上一条链使得链的长度乘链上所有点中的最小权值所得的积最大. 其中链长度定义为链上点的个数. 输入 第一行N 第二行N个数分别表示1~N的点权v[i] 接下来N-1行每行两个数x.y,表示一条连接x和y的边 输出 一个数,表示最大的痛苦程度. 样例输入 3 5 3 5 1 2 1 3 样例输出 10 题解 树的直径+并查集 首先肯定是把权值从大到小排序,按照顺序加点,维护每个连通块的最长链乘以当前点权值作为贡献. 那么如何在加上一条边,连接两棵树后快速得出新的直径…
题目传送门 题目大意 给出一个\(n\)个点的树,每个点有点权,定义一条链的贡献为该链的点数乘上链上的权值和,求出树上所有链中的权值最大值. \(n\le 5\times 10^4\) 思路 算是我入边分治的门的一道题吧...借鉴了\(\texttt{Miracle}\)巨佬的图.代码以及思路(那不就是转载么???(大雾 边分治的大概意思就是说,对于给出的一棵树,我们重新构造成一颗3度树,并且保证我们要求答案的所需性质并不会丢失.然后有一个性质: 于是我们找到重心边分治一下,递归次数就是\(\l…
题意 (n<=50000) 题解 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; ; long long cnt,head[N]; ]; long long fa[N]; long long n,a[N],b[N],book[N],ans; struct edge{ l…
「WC2010」重建计划(长链剖分/点分治) 题目描述 有一棵大小为 \(n\) 的树,给定 \(L, R\) ,要求找到一条长度在 \([L, R]\) 的路径,并且路径上边权的平均值最大 \(1 \leq n,L,R \leq 10^5\) 解题思路 : 前几天沉迷初赛来写几道数据结构恢复一下代码能力,坑填完之后可能就要开始啃思维题了QwQ. 这个题貌似长链剖分和点分复杂度都是 \(O(nlog^2n)\) 的,点分好久都没碰了,长链剖分也只有暑假里口胡了几个多校的题而已,先讲做法吧 这个题…
BZOJ 3227: [Sdoi2008]红黑树(tree) 标签(空格分隔): OI-BZOJ OI-其它 Time Limit: 10 Sec Memory Limit: 128 MB Description 红黑树是一类特殊的二叉搜索树,其中每个结点被染成红色或黑色.若将二叉搜索树结点中的空指针看作是指向一个空结点,则称这类空结点为二叉搜索树的前端结点.并规定所有前端结点的高度为-1. 一棵红黑树是满足下面"红黑性质"的染色二叉搜索树: (1) 每个结点被染成红色或黑色: (2)…
题目   点这里看题目.    BZOJ 上是权限题目. 分析   这道题可以用点分治,但是我就是喜欢边分治 QAQ .   分治过程中,我们考虑经过分治边的路径的最大痛苦值.一条经过分治边的路径会被分治边划分成两段(不包括分治边),我们只需要在它的最小值的那一段将它计入答案.   也就是说,对于每一条从分治块中一点到分治边最近端点上的路径,我们只需要计算以它的最小值作为最小值的路径的最优答案(即需要分治边对面的路径长度最长),这样就不会记重.更重要的是,写着不麻烦.   具体实现的时候,由于分…
Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define dist(u,v)=The min distance between node u and v. Give an integer k,for every pair (u,v) of vertices is called valid if and only if dist(u,v) not e…
题意 自己看. 分析 求这个平均值的最大值就是分数规划,二分一下就变成了求一条长度在[L,R]内路径的权值和最大.有淀粉质的做法但是我没写,感觉常数会很大.这道题可以用长链剖分做. 先对树长链剖分. 我们像做dsu on tree一样先做重儿子,用线段树继承重儿子的全部信息,然后做其他轻儿子 查询的时候枚举一下路径的长度len,一边单点O(1)O(1)O(1)查询长度为len的最大权值,一边线段树O(logn)O(logn)O(logn)查询长度为[L-len,R-len]的区间即可 时间复杂度…
点分治$O(nlogn)$ 坚持到月考结束后新校就剩下我一个OIer,其他人早已停课了,老师估计懒得为我一个人开机房门,让我跟班主任说了一声,今晚就回到了老校,开始了自己都没有想到会来的这么早的停课生活. 所以先水一道点分治 #include<cstdio> #include<algorithm> #define read(x) x=getint() #define N 40003 #define max(a,b) (a)>(b)?(a):(b) using namespac…
给出N(1 <= N <= 200000)个结点的树,求长度等于K(1 <= K <= 1000000)的路径的最小边数. 点分治,这道题目和POJ 2114很接近,2114是求是否存在长度为K的边,但是那个K比较大.但是这道题目的K比之小了10倍. 1. 用V[i]表示到当前树根root的路径长度为i 时的点(赋值为root结点即可),这样就可以用来判断两条到根的路径长度之和是否等于K: 结点a的root的距离为i,结点b到root的距离为j,处理完a之后会得到V[i] = ro…
1468: Tree Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1527  Solved: 818[Submit][Status][Discuss] Description 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K Input N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下来是k Output 一行,有多少对点之间的距离小于等于k Sample Input 7 1 6 13 6…
BZOJ1468 POJ1741 题意: 计算树上距离<=K的点对数 我们知道树上一条路径要么经过根节点,要么在同一棵子树中. 于是对一个点x我们可以这样统计: 计算出所有点到它的距离dep[],排序后可以O(n)求得<=K的点对数量. 但画个图后我们可以发现,对于在同一棵子树中的路径被重复计算过了.于是我们Ans-=Calc(v),减去一棵子树中的路径答案,但是这并不是之前x到它们的路径,于是给v的dep[]设一个初始值为w(x->v路径权值). 这样x的答案就计算完了,将这一过程记作…
历尽艰辛终于A掉了这题QwQ 贴COGS评论区几句话=.= 策爷:"splay/块状链表的自虐题.".深刻理解到如果没有M倾向就不要去写这题了.. -Chenyao2333 记得byvoid的博客上说这个题他当时写了整整一天,我大约写了8个小时?这种长代码程序结构一定要简单简单再简单,否则就是无限的调试了 -QhelDIV 这道题太恶心辣一定要处理好哨兵节点和null节点的数据,update时要注意![没有用哨兵节点的请随意  -wumingshi 这题确实恶心还特喵的是个板子...…
Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个实数.每天随着市场的起伏波动, 两种金券都有自己当时的价值,即每一单位金券当天可以兑换的人民币数目.我们记录第 K 天中 A券 和 B券 的 价值分别为 AK 和 BK(元/单位金券).为了方便顾客,金券交易所提供了一种非常方便的交易方式:比例交易法 .比例交易法分为两个方面:(a)卖出金券:顾客提…
题面 Bzoj 洛谷 题解 首先把最短路径树建出来(用\(Dijkstra\),没试过\(SPFA\)\(\leftarrow\)它死了),然后问题就变成了一个关于深度的问题,可以用长链剖分做,所以我们用点分治来做(滑稽). 有一点要说,这一题数据比较水,如果不用字典序的话,也可以过.如何建立字典序呢?其实我们从\(1\)号节点开始遍历路径树(不是最短路径树),令一个点的第一关键字是点权,如果点权相等就按照编号大小为第二关键字,维护一个二元组就好了. 点分治时记两个数组\(S[i]\)和\(nu…
[题目分析] 这貌似是做过第三道以Tree命名的题目了. 听说树分治的代码都很长,一直吓得不敢写,有生之年终于切掉这题. 点分治模板题目.自己YY了好久才写出来. 然后1A了,开心o(* ̄▽ ̄*)ブ [代码] #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define maxn 20005 #define inf 0x3f3f3f3f using…
nlogn的做法就是记录了在这之前每个长度的序列的最后一项的位置,这个位置是该长度下最后一个数最小的位置.显然能够达到最优. BZOJ 1046中里要按照字典序输出序列,按照坐标的字典序,那么我萌可以把序列先倒着做最长下降子序列,然后我萌就可以知道以a[i]为开头的最长的长度了.每次扫一遍记录答案即可. #include <iostream> #include <cstring> #include <cstdio> #include <algorithm>…
1468: Tree Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1025  Solved: 534[Submit][Status][Discuss] Description 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K Input N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下来是k Output 一行,有多少对点之间的距离小于等于k Sample Input 7 1 6 13 6…
D Tree Problem Description   There is a skyscraping tree standing on the playground of Nanjing University of Science and Technology. On each branch of the tree is an integer (The tree can be treated as a connected graph with N vertices, while each br…
Tree     Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define dist(u,v)=The min distance between node u and v. Give an integer k,for every pair (u,v) of vertices is called valid if and only if dist(u…