Codeforces 643E Медведь и уничтожение Поддеревья дерево дп (см пояснения)

Медведь и уничтожение Поддеревья

Рассмотрим сначала неизмененной начиная от корня до нужной глубины.

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 ; 
} 

/ * 
* /

 

рекомендация

отwww.cnblogs.com/CJLHY/p/10936763.html