f
Size: a a a
f
K
f
K
K
K
K
f
path[i].i будут являться отрезками [i, i + size], где size - размер поддерева вершины i.v разобьем на два: максимальный путь проходящий через какой то центроид c и v, и максимальный путь из c в вершину из другого поддерева, не равное тому, в котором лежит v.c через v: для этого возьмем максимум из path[i] в поддереве vpath[i] на всем ДО, кроме отрезка, равный поддереву вершины-ребенка c, в котором вершина v.v: фиксируем центроид c, находим в дереве под-отрезок, соответствующий поддереву v, везде прибавляем к path[i] какое то delta за log n с ДО с массовыми операциями.log^2 n на запрос, так как перебираем log n центроидов, и в каждом ДО делаем запросы за log nnlogn. У нас log n уровней, на каждом уровне надо построить ДО для n вершин. ДО умеем строить за O(N) для уже посчитанного массива path[i]f
si
int subsetXORSum(vector<int>& arr) {
int n = arr.size(), res = 0;
for (int i=0; i < n; ++i)
res |= arr[i];
return res * (1<< n-1);
}
Кто-нибудь может на пальцах объяснить как они к такому пришли?EZ
si
EZ
si
EZ
A
Ц
T
VU
MB