题目大意:一个$n$个点的树,树上有$m$个点对$(a,b)$,找到一个点$x$,使得$max(dis(x,a_i)+dis(x,b_i))$最小 如果做过幻想乡的战略游戏这道题,应该这道题的思路一眼能看出来 首先如果从一个点向能使答案变小的子树上走,那么从子树上一定不会再回到这个点 所以考虑一个暴力,即每次计算所有子树的答案,然后向最优的方向走 这显然是正确的,但是不够优秀 我们再深入分析一下这道题,可以发现,当且仅当所有的距离等于最大值的点对都在它的一个子树内时才可能使得答案变优 很好理解,…
好,这是一道三维偏序的模板题 当然没那么简单..... 首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了: 这么好听的名字#(滑稽) 那么我们看了题面后就发现:这就是一个三维偏序.只不过ans不加在一起,而是加在每朵花内部. 很裸的一道CDQ分治,CDQ一维,sort一维,TreeArray一维,然后就爆0了...... 把cmp函数改完备之后还是爆0,为什么呢? 看一下这一组样例: 5 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 看得出来正确答案是1 0 0 0 4 但…
洛谷 P3806 传送门 这个点分治都不用减掉子树里的了,直接搞就行了. 注意第63行 if(qu[k]>=buf[j]) 不能不写,也不能写成>. 因为这个WA了半天...... 如果memset清空ex数组显然是会T的,所以开一个bef用来记录需要清空哪个地方. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m; ],to[],nx[],…
这题因为一些小细节还是\(debug\)了很久...不过我第一次用脚本对拍,不亏. 先随便找一个点作为根,算出答案,即所有点对到这个点的距离和的最大值,并记录所有距离最大的点对.如果这个点在任意一个距离最大的点对之间的路径上,那么答案显然不能再优了,因为这个点对的答案是不能减小了的.如果有两个距离最大的点对不在根的同一子树中,答案也是显然不能再优了的,因为一个点对答案减小的同时,另一个会增大.只有当所有距离最大的点对在根的同一子树中,这时更优答案可能在这个子树里,向这个子树递归处理就行了.为什么…
喜闻乐见的CDQ分治被我搞的又WA又T..... 大致思路是这样的:把询问用二维前缀和的思想拆成4个子询问.然后施CDQ大法即可. 我却灵光一闪:树状数组是可以求区间和的,那么我们只拆成两个子询问不就行了?在统计的时候统计一个差值即可. 然后一交,自信40... 那么果然还是拆成4个吧...T了,60分. 然后放弃那个朴素的sort版CDQ,采用了归并,就A了. #include <cstdio> #include <algorithm> using namespace std;…
题目描述 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K 输入输出格式 输入格式:   N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下来是k   输出格式:   一行,有多少对点之间的距离小于等于k   输入输出样例 输入样例#1:  7 1 6 13 6 3 9 3 5 7 4 1 3 2 4 20 4 7 2 10 输出样例#1:  5 题解:点分裸题,考虑分治中的暴力,将所有的重心子树中的点到中心的距离排序,对于一组l-r之间如果…
题目:https://www.luogu.org/problemnew/show/P4178 点分治.如果把每次的 dis 和 K-dis 都离散化,用树状数组找,是O(n*logn*logn),会T7个点. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; ; ],nxt[N&…
分治线段树,其实就是将标记永久化,到最后再统一下传所有标记. 至于先后顺序,可以给每个节点开一个时间戳. 一般地,分治线段树用于离线,只查询一次答案的题目. 本题中,标记要被下传 222 次. Code: #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn = 100000 + 10; int n,m, tag[maxn << 2…
P4149 [IOI2011]Race 题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KK,且边的数量最小. 输入格式 第一行包含两个整数 n, Kn,K. 接下来 n - 1n−1 行,每行包含三个整数,表示一条无向边的两端和权值. 注意点的编号从 00 开始. 输出格式 输出一个整数,表示最小边数量. 如果不存在这样的路径,输出 -1−1. 输入输出样例 输入 #1复制 4 3 0 1 1 1 2 2 1 3 4 输出 #1复制 2 说明/提示 保证 n \leqslant 2…
题目:https://www.luogu.org/problem/P3806 题意:一棵树,下面有q个询问,问是否有距离为k的点对 思路:牵扯到树上路径的题都是一般都是点分治,我们可以算出所有的路径长度然后保留下来,点分治无非就是几步一直递归,点分治就是在树上递归 1,找树的重心 2,算出所有点到重心距离,找出当前重心的所有合法路径 3,递归到子树 然后反复执行这三步 其实点分治唯一思考的地方就是  solve函数,其他都是一样的 https://www.cnblogs.com/guoshaoy…