질문의 의미 : 주어진 넓은 범위의 것은 (1 <= 리 <= 10000000)이 범위에 나타납니다 주어진 수정을 요청 m를 의미하며, 마지막 포스터의 전체 수를 보여달라고
아이디어는 우리가 분리 된 데이터를 생각하는 것 같은 넓은 범위를 볼 수, 키가 큰 이산 실제로 압축 된 데이터 공간이 주어 말했다. 데이터가 빈 공간에 너무 넣어 압력 (1 1E7에) 전체 주어지지 않기 때문에, 다른 연속 공간 예약
사용하지 않을 때는 연속 공간 압축 빈 공간으로 공간을 증가시키기 위해, 그 주
전체 코드 :
#INCLUDE <CString을> #INCLUDE <iostream> #INCLUDE <cstdio> #INCLUDE <알고리즘> 은 USING 공간 STD; CONST의 INT MAXN = 1E5; CONST INT INF = 0x3f3f3f3f ; INT SEG는 [MAXN는 << 2 ] int로 게으른 [MAXN를 < < 2 ] INT ARR [MAXN, ANS [MAXN] INT 최근, INT의 L [MAXN, R & LT [MAXN] 약 // 저장 심문 범위 의 INT TOT, int로 압축 후 // 세그먼트; DSEG [MAXN]를 트리 무효 push_up ( INT의 P) { 경우 (SEG [P << 1 ] == SEG [P << 1 | 1 ]) SEG [P] = SEG [P << 1 ]; 다른 SEG [P] = INF; } 공극 push_down ( INT의 P, INT의 L, INT의 R) { 경우 (지연 [P]! = INF) { 지연 [P << 1 ] = 지연 [P]; 지연 [P << 1 | 1 = 지연 [P]; SEG [P << 1 ] = 지연 [P]; SEG [P << 1| 1 = 지연 [P]; 지연 [P] = INF; } } 공극 빌드 ( INT의 P, INT의 L, INT의 r)을 { 경우 (L == R) { SEG [P] =의 도착 [1]; 반환 ; } INT 중간 = (L + R) >> 1 ; 빌드 (p << 1 , L, MID); 구축 (P << 1 | 1 , 중반 + 1 , R); push_up (p); } 무효 업데이트 ( INTP, INT의 L, INT R, INT QL, INT QR, INT V) { 경우 (QL <= 1 && R <= QR) { SEG [P] = V; 지연 [P]는 = V 단계; 반환 ; } push_down (P, L, R); int로 중간 = (L + R) >> 1 ; 경우 (QL <= MID) 업데이트 (p << 1 , L, 중간, QL, QR, V); 경우 (QR> MID) 업데이트 (p << 1 | 1 중간 + 1 , R, QL, QR, V); push_up (p); } 무효 쿼리 (INT의 P, INT의 L, INT R, INT QL, INT QR) { 경우 (SEG [P]! = INF) { 경우 (SEG [P]가 = 마지막) SEG [P]를 ++ ans와! ; 마지막 =의 SEG [P]; 반환 ; } 경우 (L == R) = {INF 마지막; 반환 } INT 중간 = (L + R) >> 1 ; push_down (P, L, R); 쿼리 (p << 1 , L, 중간, QL, QR); 쿼리 (p << 1 | 1 중간 + 1 , R, QL, QR); } INT 의 main () { INT T, N-; CIN >> T, 그동안 (T-- ) { TOT = 0 ; CIN >> N-; IF (! N-) COUT << 0 << ENDL; // 마다 때문에 이 간격 커버리지 문제 때문에 여기 업데이트 데이터에 해당 기록 다른 { 대 ( INT K = 0 ; K <N- K ++ ) { CIN >> L [K] >> R & LT [K]는, DSEG [TOT ++] = L [K] DSEG [TOT ++] = R & LT [K]; } // 개별 처리 정렬 (DSEG, DSEG + TOT) INT LEN = UNIQUE (DSEG, DSEG + TOT) - DSEG; INT의 크기 = LEN, 대 ( INT I = 1. , I는 크기 <; I는 ++ ) { // 간격하지 않는 관하여 연속 부 블랭크 (이전보다 큰 공간을 복용 1.) 증가 IF (DSEG [I] - DSEG [I- 1. ]> 1이다. ) DSEG [LEN ++ = DSEG [I- 1. ] + 1이다. ] } 정렬 (DSEG, DSEG + 렌) 에 대해 ( int로 I = 0; I <N-; I는 ++ ) {) { // 다음 이산 좋은 L로 재진입, R 배열 L의 [I]가 = LOWER_BOUND (DSEG, DSEG + LEN, L [I]) - + DSEG 1이다. ] R & LT [I] DSEG = LOWER_BOUND (DSEG, + LEN, R & LT [I]) - DSEG + 1이다. ] } 가 memset (게으른, INF, sizeof의 (게으른)); memset 함수 (ARR, INF, sizeof의 (ARR)); memset 함수 (ANS, 0 , sizeof의 (ANS)); 빌드 ( 1. , 1. , 렌을) 위해 ( int로 나 나 = 0 ; 나는 <N-, 나는 ++ 업데이트 ( 1. , 1. 렌, L [I], R & LT [I] + I 1이다. ) } 마지막 = INF] // 포스터의 수 (도 말할 통계적 컬러) 카운트 (쿼리 . 1 , . 1 , LEN, . 1 , LEN) int로 CNT = 0 ; 대 ( INT I = 1이다. ]은 I = LEN <; I는 ++ ) { IF (ANS [I]) CNT ++ ; } COUT << CNT << ENDL; } } }