//---------------------------------------------------------------------------
本篇博客是19年9月份写的,因为改成了比赛题目,所以设置隐藏,现在重新发。
//----------------------------------------------------------------------------
题目链接:https://vjudge.net/problem/Gym-101484F
原题目给的是一棵完全二叉树,所以暴力就可以过。
这里假设它是一颗一般树,那么可以用dsu on tree+线段树用O(N*logN*logN)的时间复杂度解决,或者用长链剖分+线段树+前缀最大值+后缀最大值做到O(N*logN)的时间复杂度。
dsu on tree 做法如下:
线段树维护当前每层的剩余点权和,然后启发式合并。
#include <bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define per(i, a, b) for(int i = (a); i >= (b); i--)
#define mp make_pair
#define pb push_back
#define ls (o<<1)
#define rs (o<<1|1)
#define mid (l+r>>1)
#define ll