bzoj 4860 [BeiJing2017]树的难题
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4860 题解 点分治 设当前重心为v 假设已经把所有边按照出发点第一关键字, 颜色第二关键字排序 对于当前的v 我们顺次考虑他的出边 设当前出边(v,nw) 颜色 col 我们枚举nw的出边 对于一条nw的出边而言, 分为两种情况 1. 颜色与col相同 用线段树维护深度及对应的最值,查询到最大值即可 (v,nw)没有贡献 2. 颜色与col不同 用另一棵线段树维护深度以及与(当前节点的连向其父节点的边的颜色)不同的(连向子节点的边)所对应的子节点对应的子树之内的最值 加上col的权值 向上的时候 将线段树合并 Code 1 #include <cstdio> 2 #include <cctype> 3 #include <algorithm> 4 const int maxn= 400010 ,inf= 2000000010 ; 5 int ans,n,x,y,z,i,m,l,r,c[maxn* 3 ],cnt; 6 inline int max( int a, int b){ 7 return a>b? a:b; 8 } 9 inline void up( int &a, const int & b){ 10 if (a<b)a= b; 11 } 12 inline int