// 세그먼트 트리 간격 커버리지 #INCLUDE <cstdio> #INCLUDE <CString을> #INCLUDE <iostream> #INCLUDE <알고리즘> 은 USING 스페이스 STD 단계; CONST INT N = 100010 ; INT 플래그; 구조체 노드 { INT의 L, R & LT; // VIS 이 영역은 완전히 덮은 BOOL ; VIS } TR [N << 2 ] 구조체 포인트 { INT의 ID를, INT X; } POST [N << 2 ] INT 창 CMP1 (점 A, 점 B) { AX < BX; } INT의 CMP2 (점 A, 점 B) { 경우 (a.id == b.id) 창 AX < BX; 반환 a.id> b.id을; } 공극 팔 굽혀 펴기 ( INT U) { TR [U] .vis = TR [U << 1 ] .vis && TR [U << 1 | 1 ] .vis; } 공극 빌드 ( INT U, INT (L), INT (R)) { TR [U] = {L, R, 0 }; 경우 (L == R) 반환; INT 중간 = L + R >> 1 ; 빌드 (U << 1 , L, MID); 빌드 (U << 1 | 1 중간 + 1 , R); } 공극 쿼리 ( INT U, INT (L), INT (R)) { 경우 (TR [U] .vis) 창 ; 경우 (TR [U] 펜닐 == L && TR [U] == .R R) { TR [U] .vis = 1 ; 플래그 = 1 ; 반환 ; } INT 중간 TR = [U] 펜닐 + TR [U] .R >> 1 ; 경우 (R <= MID) 쿼리 (U << 1 , L, R); 다른 경우 (L> MID) 쿼리 (U << 1 | 1 , L, R); 또 { 쿼리 (U << 1 , L, MID); 쿼리 (U << 1 | 1 중간 + 1 , R); } (U)를 팔 굽혀 펴기; } INT 의 main () { INT의 t, N; CIN >> t; 동안(T-- ) { CIN >> N-; // 이산 데이터 전에 대 ( INT I = 0 ; I < 2 * N-] + I = 2 ) { CIN >> POST [I] .x를 POST >> [I + . (1) ] .x와; POST [I] .ID = POST [I + 1이다. ] .ID = I; } // 이산화 전에 정렬 데이터 정렬 (POST, POST + 2 * N-, CMP1)를; // 이산화 INT TOT = 0 , 미리 = 0 ; 대 ( 지능 I = 0 ; I < 2 * N-; I ++ ) { // 이전과는 경우 // 다음으로 순위 IF (POST [I] .x를 == 사전) { POST [I] .x를 = TOT ; } // 현재 값을 기록하지 않으면 // ++ 순위 다른을 { 미리 = POST [I] .x와; POST [I]를 .x를 = ++ TOT; } } 빌드 ( . 1 , . 1 , 2 *N-) //는 정렬 뒤에서 붙여 // ID 큰 앞에 정렬 (POST, POST + 2 * N -, CMP2) INT ANS = 0 ; 대 ( INT I = 0 ; I < 2 * N-; I +을 = 2 ) { INT의 L = POST [I] .x와; INT R & LT POST = I + 1이다. ] .x와; 에서 플래그 = 0 , 쿼리 ( 1. , L, R & LT) IF (인 플래그) ANS ++ ; } COUT<< ANS << ENDL; } 반환 0 ; }