질문의 의미 : 주어진 N, C, K를.
그리고, (1 ~ C 사이) Q 긴 구간 길이가 n 개의 숫자를 제공한다. K의 모든 발생을 만족 섹션 번호가 적어도 한 번 나타난다.
아이디어 :
우리가 아마 간격을 판단하는 기준을 충족 할 수 있으며, 다시 파티션 간 조건의 인덱스 번호를 충족하지 않는 간격을 누르면 다시 판단 할 수 있습니다.
모든 가능한까지의 간격의 조건이 완성 판단 충족합니다.
: 구덩이
더 복잡 경계 (L, R) 및 조건의 치료, 간 파티션에 특별한주의를 지불의 수 사이의 관계의 대상에서 만족하지 않습니다.
: 구덩이
더 복잡 경계 (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 ; }