2018 Летний ACM скот с мультисервисной сетью школы учебно-тренировочный сбор (первый) F: Сумма Максимум

Смысл проблем: заданное число N A [], и теперь образуют новый массив б с [], 1 <= Ь [г] <= а [I]. Q. максимальное значение всех программ и.

Идеи: первый заказ. Затем сегментация статистического вклада, предполагая [I-1] <а [I], то [а [я-1] + 1, а [я]] вклад оставил все программы * законное право программы, что является законным это максимальное значение в пределах этого диапазона.

Пусть макс = х, то вклад в правой части х * (х ^ (п-я + 1) - (х-1) * (п-я + 1)), все х сложить, чтобы найти префикс и, = х ^ (п-г + 2) + (х-1) ^ (п-я + 1) ... ^ (п-г + 1); крайняя правая часть может быть определена с использованием лагранжиан.

Все будет закончено. Но мой совет, кажется, немного медленно.

(В конце концов, я добавил дополнительный журнал, изменить его завтра. Сегодня есть несколько вопросов, которые составляют.

(Но в действительности это в рамках подготовки к борту.

# include <. бит / STDC ++ H>
 #define LL долго долго
 #define Rep (я, а, б) для (INT I = а; г <= Ь; я ++)
 с использованием  пространства имен STD;
Const  INT maxn = 200010 ;
Const  INT Mod = 1e9 + 7 ;
Const  INT мод = 1e9 + 7 ;
ИНТ в [maxn], сумма [maxn], анс; 
LL F [maxn], FAC [maxn], INV [maxn]; 
LL Р (LL а, б LL) 
{ 
    LL ANS = 1 ;
    в то время как (б) {
         если (б & 1 ) ANS = ANS * а% по модулю; 
        б >> =1 ; а = а * а% по модулю; 
    } 
    Если (анс < 0 ) ANS + = мод;
    вернуться анс; 
} 
Недействительными инициализации ( INT TOT) 
{ 
    FAC [ 0 ] = 1 ;
    для ( INT I = 1 ; я <= TOT; я ++ ) 
        FAC [I] = FAC [i - 1 ] * я% по модулю; 
    INV [TOT] = Р (FAC [TOT], mod - 2 ); 
    INV [ 0 ] = 1 ; // 求阶乘逆元
    для ( INT I = tot-1 ; я> = 1 ; i-- ) 
        INV [I] = INV [I + 1 ] * (г + 1 )% по модулю; 
} 
LL Лагранжа (LL п, LL к) 
{ 
    Rep (я, 1 , к + 1 ) П [I] = (е [i - 1 ] + P (I, к- 1 ))% по модулю;
    если (п <= к + 1 ) возвращение F [N];
    INT TOT = к + 1 ; INIT (общ); 
    LL ANS = 0 , то теперь = 1 ;
    для ( INT I = 1 ; я <= карапуз, я ++) в настоящее время = в настоящее время * (п)%мод;
    для ( INT I = 1 , я <= TOT; я ++ ) { 
        LL INV1 = P (п, mod - 2 ); 
        LL INV2 = INV [i - 1 ] * INV [TOT-я]% по модулю;
        если ((TOT-я) & 1 ) INV2 = mod - INV2; 
        LL темп = * Теперь INV1% по модулю; 
        Темп = темп * е [я]% мод * INV2% по модулю; 
        ANS + = темп;
        если (ANS> = моды) ans- = моды; 
    } 
    Возврата ANS; 
} 
Int решения ( INT х, INTк) 
{ 
    если ! (х) возврат  0 ;
    вернуться Р (х, к + 1 ) -Lagrange (х 1 , к + 1 ); 
} 
INT основных () 
{ 
    INT N;
    в то время как (~ зсапЕ ( " % d " , & N)) { 
        Rep (я, 1 , N) зсапЕ ( " % d " , & [I]); 
        рода (а + 1 , а + N + 1 ); ANS = 0 ; Сумма [ 0 ] = 1 ; 
        Rep (я, 1, N) , сумма [I] = 1LL * сумма [i - 1 ] * а [я]% Мод; 
        Rep (я, 1 , N) {
             если (а [я] == а [i - 1 ]) продолжить ;
            INT Рез = (решение (A [I], N-I + 1 ) -solve (а [i - 1 ], N-I + 1 ) + Mod)% Моды; 
            (ANS + = 1LL * сумма [i - 1 ] * разреш% Мод)% = моделирование; 
        } 
        Е ( " % d \ п " , ANS); 
    } 
    Возвращает  0 ; 
}

 

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

отwww.cnblogs.com/hua-dong/p/11455218.html