이 질문에 대한 첫 번째 이산 지식,하지만 기존의 이산 이산를 사용합니다.
유닛 (1)은 단위 길이 때문에 개별 다음 예로서 (대상 시료)이 될 것 아래의
1. 4. 3. 6 7 8 2 10
- - - - - - - -
1 2 5 4 3 6 7 8
이산 X [1] = 1, X [2] = 2; X [3] = 3; X [4] = 4, X [5] = 6, X [7] = 8, X [8] = (10)
다음, 다음 순서대로 각 포스터 1 내지 8 (트리 라인) 벽의 폭은, 서로 다른 색의 세그먼트 수의 최종 집계를 업데이트하기 위해 더 작은 세그먼트로 맵핑 큰 범위.
하지만 이러한 단순한 이산화이 잘못
같은 세 포스터 :. 1 ~ 10 1 ~ 10 ~. 제 6
X- [. 1] = 이산화. 1, X [2] = 4, X [3] = 6, X [4]를 10 =
첫 번째 장을 계시 : 1-4 벽 1 염색되며
제 장 계시 : 1 내지 2 벽은 여전히 1, 3, 4 염색;
셋째 장 계시 : 3-4 벽은 2 여전히 3,1 염색.
마지막으로, 첫 번째 포스터는 출력이 있지만, 사실은 그렇게 중요하지 않습니다 그래서 완전히 덮여 표시, 그것은 올바른 출력 3입니다.
새로운 개별 방법 : 객실 다수의 추가는, 1 이상 차이가 예를 들어 14610위한 중간체 5 이상 첨가 (6,10 및 1,4 사이 알고리즘 실제로 숫자 사이에 첨가된다)
X [1] = 1, X [2] = 4, X [3] = 5, X [3] = 6, X [5] = (10)
(1) 염색 제 1~5 후 이와 같이 상기 제 1-2 차 2를 염색하고, 상기 제 4-5 3 염색
마지막으로, 1 ~ 2 5 ~ 1, 4, 2, 3, 3, 3 때문에 정확한 출력 결과있다.
붙여 넣기 포스터, 트리 라인 열린 공간을 생각 뒤쪽에 관심을 지불한다. C ++와 POJ이 살 수 G ++를 통과하지 수, 이유를 알고하지 않습니다
오류 참고도 이산 매우 경향의 이산 범위라는 것을 소개.
사용법 #include <iostream> #INCLUDE < 문자열 > #INCLUDE <cstdlib> #INCLUDE <알고리즘> #INCLUDE <cmath> #INCLUDE <CString을> #INCLUDE <cstdio> #INCLUDE <벡터> #INCLUDE <큐> #INCLUDE <지도> #INCLUDE < 세트 > #INCLUDE <비트 세트> #INCLUDE <iomanip> // 의 #pragma 주석 (링커 "/ STACK : 1024000000,1024000000") // #DEFINE의 파이 ACOS (-1) // #INCLUDE <비트 / stdc ++ .H>사용하는 네임 스페이스 표준을; 형식 정의를긴 긴 LL; #DEFINE INF 0x7f7f7f7f // 2139062143 #DEFINE INF1 0x3f3f3f3f // 1061109567 #DEFINE INF2 2147483647 #DEFINE llINF 9223372036854775807 #DEFINE PI 3.141592653589793 // 23,846,264,338,327,950,254 #DEFINE PB와 push_back #DEFINE LL 긴 긴 #DEFINE 디버그 COUT << "디버그 \ n '; // freopen을 ( "R", 표준 입력 "입니다."); // freopen을 ( "w", 표준 출력 "알아."); // IOS :: sync_with_stdio (거짓) cin.tie (NULL); #DEFINE SCAI (X)는 scanf ( "%의 D", sca2i (X, Y)는 scanf ( "% D % D ', X, Y) #DEFINE SCAF (X)는 scanf ("%의 LF ", X) #DEFINE sca2f (X, Y)는 scanf ("% LF % LF ", X, Y) #DEFINE 용 (m, n)에 대한 (INT I = m; I <N; I ++) #DEFINE 로컬 #ifdef와 로컬 #endif 다음의 #DEFINE MAX 10233 #DEFINE의 LCH (I) ((I) << 1) #DEFINE RCH (I) ((I) << 1 | 1) INT X [MAX] [ 2 ]; INT LSH [MAX << 1 ]; 구조체 노드 { INT의 L, R; int로 게으른; } 트리 [MAX << 3 ]; 빌드 (INT의 RT, INT (L), INT (R)) { // 디버그 트리 [RT] 펜닐 = L; 트리 [RT] .R = R; 트리 [RT] .lazy = 0 ; 경우 (L == R) { 창 ; } INT 중간 = (L +의 연구) >> 1 ; 빌드 (RT << 1 , L, MID); 빌드 (RT << 1 | 1 , 중반 + 1 , R); } BOOL updata ( INT RT, INT L, INT R) { 경우 (트리 [RT] .lazy) { 반환 거짓 ; } 다른 경우 (트리 [RT] 펜닐 == L && 트리 [RT] == .R R) { 트리 [RT] .lazy = 1 ; 반환 사실 ; } INT의 중간 = (트리 [RT] 펜닐 + 트리 [RT] .R) >> 1 ; bool에 플래그를; 경우 (R <= MID) { 플래그 = updata (RT << 1 , L, R); } 다른 경우 (L>MID) { 플래그 = updata (RT << 1 | 1 , L, R); } 다른 { BOOL 인 flag1 updata = (RT << 1 , L, MID); 불리언 flag2 updata = (RT << 1 | 1 중간 + 1 , R); 플래그 = 인 flag1 || flag2; } 경우 (트리 [RT << 1 ] .lazy == 1 && 트리 [RT << 1 | 1 ] .lazy == 1 ) 트리 [RT] .lazy = 1 ; 반환 플래그를; } INT 의 main () { INT 케이스; scanf와 ( " % D \ n " , 및 케이스); 반면 (Case-- ) { INT의 N; scanf와 ( " %의 D ' , N); INT (K) = 0 ; 위한 ( INT 난 = 0 , N I <; I ++ ) { scanf와는 ( " % D % D ' , X [I] [ 0 ], X [I] [ 1 ]); LSH [K ++] = X [I]0 ]; LSH [K ++] = X [i]는 [ 1 ]; } 정렬 (LSH, LSH의 + K); INT 크기 = 고유 (LSH, LSH + K) - LSH; K = 크기; 위한 ( INT 난 = 0 ; I <크기; I ++ ) { 경우 (LSH [I] - LSH [I- 1 ]> 1 ) LSH [K ++] = LSH [I] + 1 ; } 크기 = K; 종류 (LSH, LSH의 +크기); 빌드 ( 1 , 0 , 크기 - 1 ); INT ANS = 0 ; 대 ( INT I = N- 1 ] I> = 0 ; 난 ... ) { INT의 L = LOWER_BOUND (LSH, LSH + 사이즈, X [I] [ 0 ]) - LSH; INT R = LOWER_BOUND (LSH, LSH + 사이즈, X [I] [ 1 ]) - LSH; 경우 (updata ( 1 , L, R)) ans와 ++ ; } 의 printf ( " 가 % d \ n" , 년); } }