Медведь и уничтожение Поддеревья
Рассмотрим сначала неизмененной начиная от корня до нужной глубины.
DP [I] [J] обозначает поддерева я дерево всех ребер половины случая, когда вероятность присутствия, максимальная глубина вероятности у.
Мы рассматриваем только слой 50 достаточно, потому что вероятность уменьшается с отношением длины боковой экспоненциально. После этого случая, обработка префикса дп,
Передача может быть связана с корнем, но мы вошли в точке плюс необходимо обновить значение лазания дпа насилие в Интернет, это
Жесткое состояние занимает O (1) обновлено. , ,
Мы считаем, что новое состояние дп дп [я] [J] представляет собой я суб-дерево дерево, максимальная глубина <= J вероятности. Переходное состояние уравнение, записанное на нем
Найдено в O (1), чтобы изменить его.
Это обновление до насилия как можно больше в каждое поддерево может быть разделена форма.
# include <бит / STDC ++. ч> #define LL долго долго #define ЛД длиной двойной #define лный без знака долго долго #define фи первый #define себе второй #define тк make_pair #define ФАПЧ пара <LL, LL> #define PLI пара <LL, Int> #define PII пары <Int, Int> #define SZ (х) ((INT) x.size ()) #define ALL (х) (х) .begin (), (х) .END ( ) #define FIO ИОС :: sync_with_stdio (ложь); cin.tie (0); с помощью пространства имен STD; Const INT N = 5e5 + 7 ; Const ИНТ инф = 0x3f3f3f3f ; Const Л.Л. INF = 0x3f3f3f3f3f3f3f3f ; Const INT мод = 1e9 + 7 ; константный двойной EPS = 1e- 8 ; Const двойной PI = ACOS (- 1 ); Шаблон < класс Т, класс S> инлайн пустот Add (T & A, S б) {а + = Ь; если (а> = мод) а - = мод;} шаблон < класс Т, класс S> инлайн пустот к югу (Т & A, S б) {а - = Ь; если (а < 0) = А + мод;} шаблон < класс Т, класс S> встроенный BOOL chkmax (Т & A, S б) { вернуть а <Ь? а = Ь, верно : ложь ;} шаблон < класс Т, класс S> встроенный BOOL chkmin (Т & A, S б) { вернуть A> B? а = Ь, верно : ложь ;} INT п, д, ра [Н]; INT глубина [N]; двойная дп [N] , [ 51 ]; INT основных () { для ( INT I =1 ; я <N; я ++ ) для ( INT J = 0 ; J <= 50 ; j ++ ) дп [I] [J] = 1,0 ; зсапЕ ( " % d " , & д); п ++ ; в то время как (q-- ) { INT оп, и; зсапЕ ( " % d% d " , & оп, & и); если (ор == 1 ) { INT v = ++ п; ра [v] = U; INT дворняжка =и; двойной tmp1 DP = [положить] [ 0 ] * 0,5 + 0,5 , tmp2; для ( INT о = 1 ; от < 50 && ПА [поместить]; O ++ ) { tmp2 = DP [ПА [поместить]] [O] * 0,5 + 0,5 ; DP [PA [Put]] [о] / = tmp1; ставить = PA [Put]; tmp1 = tmp2; } ДП [и] [ 0 ] * = 0,5 ; ставить =и; для ( INT O = 1 , О <= 50 && ра [Cur], О ++ ) { дп [ра [текущ]] [O] * = 0,5 + 0,5 * дп [текущ] [о - 1 ]; текущ = ра [текущ]; } } Еще { двойной ANS = глубина [и]; для ( INT I = 1 ; г <= 50 ; я ++ ) ANS + = I * (дп [и] [I] - дп [и] [я - 1 ]); Е ( " % .12f \ п " , ANS); } } Возвращают 0 ; } / * * /