Codeforces 1175E Минимальный сегмент крышки в два раза

Минимальный сегмент крышки

Э э э. , Удвоение время воспроизведения для двух выписал чек на долгое анти-ошибка. , ,

Мы первая линия бесполезен удалена, а затем для каждого сегмента находятся г, как самый большой и один из его контакта с нижней, а затем ударил достаточно размножаться.

# 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  ИНТ мод = 998244353 ;
константный  двойной 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];
INT NEX [N] , [ 20 ]; 

структура линии {
     INT L, R;
    BOOL Оператор <( Const линия & RHS) сопзЬ {
         если (л == rhs.l) возвращение г> rhs.r;
        вернуться л < rhs.l; 
    } 
} A [N]; 

INT основных () { 
    зсапЕ ( " % d% d " , & п, & м);
    для ( INT I = 1 ; г <= п; я ++) зсапЕ ( " % d% d " , & а [я] .l, & а [я] .r), а [я] .r-- ; 
    рода (а + 1 , а + 1 + N);
    INT пп = п; п =1 ;
    для ( INT I = 2 ; я <= пп; я ++ )
         , если (а [я] .r> а [п] .r) а [++ п] = A [I];
    для ( INT I = 1 ; г <= п; я ++ ) { 
        с [а [я] .l] ++ ; 
        с [а [я] .r + 1 ] - ; 
    } 
    Если (с [! 0 Префикс []) 0 ] = 1 ;
    для ( INT I = 1 ; г <= 500000 ; я ++ ) { 
        с [я]+ = С [г - 1 ];
        если (! с [I]) префикс [I] = 1 ; 
        Префикс [я] + = Префикс [я - 1 ]; 
    } 
    Для ( INT I = 1 , J = 2 ; г <= п; я ++ ) { 
        J = макс (I + 1 , J);
        в то время как (к <= п && а [J] .l <= а [я] .r + 1 ) j ++ ; 
        NEX [I] [ 0 ] = J - 1 == I? 0 : J - 1 ; 
    } 
    Для ( INT J = 1; J < 20 ; j ++ )
         для ( INT I = 1 ; г <= п; я ++ ) 
            NEX [I] [J] = [NEX NEX [I] [J - 1 ]] [J - 1 ];
    в то время как (m-- ) {
         INT х, у; зсапЕ ( " % d% d " , & х, & у); 
        у - ;
        INT CNT = Префикс [у];
        если (х) CNT - = Префикс [х - 1 ];
        если (CNT) { 
            пут ( " -1 " );
        } Иначе {
             INT р = lower_bound (а + 1 , а + 1 + п, линия {х + 1 , инф}) - а - 1 ;
            если (а [р] .r> = у) { 
                пут ( " 1 " ); 
            } Иначе {
                 INT ANS = 0 ;
                для ( INT I = 19 ; я> = 0 ; i-- ) {
                     если (NEX [P] [I] && а [NEX [P] [I]] г <. у) {
                        р = NEX [P] [I], ANS + = (1 << я); 
                    } 
                } 
                Е ( " % d \ п " , ANS + 2 ); 
            } 
        } 
    } 
    Возвращают  0 ; 
}

 

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

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