カバーは倍増Codeforces 1175E最小セグメント

最小限のセグメントカバー

えーえーえー。2のための再生時間を倍にすることは、長い抗バグのチェックを書きました。

我々は、最初の行は無駄を除去し、各セグメントについて、次に乗算十分ヒット下部との接触の最大の一つとしてRを発見しています。

#include <ビット/ STDC ++。H>
 の#defineは LL長い長
 の#define LD長い二
 の#define ULL符号なし長い長
 の#define第Fiの
 に#define SE第二
 の#define MK make_pair
 の#define PLL対<LL、LL>
 の#define PLI対<LL、整数>
 の#define PII対<整数、整数>
 の#define SZ(X)((INT)x.size())
 の#define ALL(X)(X).begin()、(X).END( )
 の#define FIOイオス:: sync_with_stdio(偽); cin.tie(0)。使用して名前空間はstdを、CONSTのINT N = 5E5 + 7 const int型

 

  INF = 0x3f3f3f3f constの LL INF = 0x3f3f3f3f3f3f3f3f const  int型のmod = 998244353 ;
constの ダブル EPS = 1E- 8 ;
CONST  ダブル PI = ACOS( - 1 )。

テンプレート < クラス T、クラス S>インラインボイド追加(T&、S b)は{A + B =。もし(A> = MOD)A - = MOD;} 
テンプレート < クラス T、クラス S>インラインボイドサブ(T&、S b)は、{ - = B。もし(<0)、A + = MOD;} 
テンプレート < クラス T、クラス S>インラインBOOL chkmax(T&、S B)は{ 返す <bは?= B、;} 
テンプレート < クラス T、クラス S>インラインブール chkmin(T&、S b)は{ 返す > bは?= B、;} 

int型N、M、[N] C。
int型の接頭辞[N];
INT NEX [N] [ 20 ]。

構造体のライン{
     int型のL、R。
    BOOL 演算子 <(constのラインアンドRHS)のconst {
         場合(L == rhs.l)戻り R> rhs.r。
        リターンリットル< rhs.l。
    } 
} [N]。

INT メイン(){ 
    scanf関数(" %d個の%のD "、&​​N、&M)。
    以下のためにint型 i = 1 ; iが<= N; iは++)scanf関数を(" %d個の%のD "、および[I] .L、&[I] .R)、[I] .r-- 
    ソート( + 1、A + 1個の + N)。
    INT NN = N。N =1 ;
    以下のためにint型 I = 2 ; I <= NN; iは++ 場合([I] .R> [N] .R)++、nは] = [I]。
    以下のためにint型 i = 1 ; iが<= N; iは++ ){ 
        C [I] .L] ++ ; 
        C [I] .R + 1 ] - 
    } 
    もし(!C [ 0 ])の接頭辞[ 0 ] = 1 以下のためにint型 i = 1 ; iは= < 500000 ; I ++ ){ 
        C [I]+ = C [I - 1 ]。
        もし(!C [i])と接頭辞[I] = 1 ; 
        接頭辞[I] + =接頭辞[I - 1 ]。
    } 
    のためのint型 I = 1、J = 2 ; iが++; iが<= N ){ 
        J = MAX(I + 1 、J)。
        一方、(j <= N && [J] .L <= [I] .R + 1)J ++ 
        NEX [i]が[ 0 - ] J = 1、私は==を?0:J - 1 
    } 
    のためのINT J = 1; J < 20 ; J ++ のためにint型 I = 1は iが++; iがn = <; 
            NEX [I] [J] = NEX [ - NEX [I]、[J 1 ] [jは- 1 ]。
    一方、(M-- ){
         int型 X、Y。scanf関数(" %dの%のD "、およびX&Y)。
        Y - INT CNT = 接頭辞[Y]。
        もし =プレフィックス- (X)CNT [X - 1 ]。
        もし(CNT){ 
            プット(" -1 " )。
        } {
             INT P = LOWER_BOUND(A + 1、A + 1 + nは、行{X + 1、INF}) - - 1 もし(> = [P] .R Y){ 
                プット(" 1 " )。
            } {
                 int型 ANS = 0 以下のためにint型 iは= 19、I> = 0 ; i-- ){
                     場合(NEX [P] [I] && [NEX [P] [I] R < Y){
                        P = NEX [P] [i]は、 ANS + =(1 << I)。
                    } 
                } 
                のprintf(" %d個の\ n "、ANS + 2 )。
            } 
        } 
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/CJLHY/p/10982809.html