2019 꽉 전기 멀티 학교 교육 1012

 
질문의 의미 : 주어진 N, C, K를.
그리고, (1 ~ C 사이) Q 긴 구간 길이가 n 개의 숫자를 제공한다. K의 모든 발생을 만족 섹션 번호가 적어도 한 번 나타난다.

아이디어 :
우리가 아마 간격을 판단하는 기준을 충족 할 수 있으며, 다시 파티션 간 조건의 인덱스 번호를 충족하지 않는 간격을 누르면 다시 판단 할 수 있습니다.
모든 가능한까지의 간격의 조건이 완성 판단 충족합니다.

: 구덩이
더 복잡 경계 (L, R) 및 조건의 치료, 간 파티션에 특별한주의를 지불의 수 사이의 관계의 대상에서 만족하지 않습니다.
#INCLUDE <비트 / stdc ++ H.>
 사용  스페이스 성병;
#DEFINE은 (a, b)가 memset 만난 (A, B를 sizeof는 (a))
 값 int A [ 100009를 ];
INT ANS = 0 ; 
지도 < INT , 벡터 < INT >> POS;
int로 N, C, K;
보이드 DFS ( INT의 L, INT의 R) 
{ 
    // COUT << L << "............."<< R << ENDL; 
    만약 (R-L + 1 <K) ;
    경우 (L == R) 
    { 
        경우 (K <= 1) ANS = 최대 (ANS, 1 );
        반환 ; 
    } 
    다른  경우 (R <l) ;
    int로 I = 0 ;
     (I = 1; I <= (R)] 나 ++ ) {
             INT TL = LOWER_BOUND (.. POS [A [I] (시작), POS [A [내가] 단부 (), l) - 포스 [A [ I] 시작한다 ().;
            INT TR = UPPER_BOUND (POS [A [I] (시작), POS [A [내가] 단부 (), R..) - 포스 [A [I]를 (시작). 

            경우 (TR - TL <K) 분해 ; 
    } 
    경우 (I == R + 1 ) = 최대 ANS (ANS, R-L + 1 );
    다른 
    { 
        int로 = 일을L, J;
        에 대한 (j = 0 ; j를 <POS [A [I]의 크기 (). J ++) 경우 (세인트 <= POS [A [I] [J]) 체류 ;
           (; J <POS [A [I]의 크기 () && POS [A [I] [J] <R, J ++. ) 
          { 
              DFS (ST, POS [A [내가] [J] - 1 ); 
              세인트 = POS [A [I] [J] + 1 ; 
          } 
          만약 (j < POS [A [I]의 크기 ()). 
                   DFS (ST, R); 
          
          { 
              DFS (POS [A [I]는 [J - 1 ] + 1 , R); 
          } 

    } 
    반환 ;
} 
INT 의 main () 
{ 

    동안 (CIN >> N C >> >> K) 
    { 
         위해 ( int로 I = 1 ; i가 =에 c <I ++는 POS [I]하는 명확한 ()); 
        만난 (a, 0 ); 
        ANS = 0 ;
        위한 ( int로 I = 1 ; 나는 <= N; I ++는 ) 
        { 
            는 scanf ( " %의 D를 " , & A [I]); 
            . POS [A [내가]와 push_back (I); 
        } 
        // COUT << "1"<< ""<< N << ENDL; 
        DFS ( 1 ,
<< ANS << ENDL; 
    } 
    반환  0 ; 
}

 




 

추천

출처www.cnblogs.com/yzxqq/p/11247359.html