질문의 의미 : 플레이트 색상, 색상의 범위 내에서 문의의 수.
해결 : 색상의 수는 30 개 종에 제목을 포기하기 때문에, 부모 섹션을 업데이트 바이너리 또는 작업에서 빌릴 수 있습니다. 그러나이 세그먼트 트리를 붙여 게으른 ------ 지연 업데이트에 기록됩니다.
기타가 아주 좋은, 직접 차입이, 작성한 블로그 링크를 https://blog.csdn.net/Tong_zhi/article/details/82683219
함축 된 의미는 간격이 발생하는 경우, 업데이트 간격에 포함되어 있다는 것입니다, 기존의 생각에 따르면, 하나 하나를 수정, 잎 노드를 통과 계속하는 것입니다, 그러나 이것은 시간 낭비이다.
(요소가 특정 값으로 변경 될 필요의 범위 내) 등의 순 간격 게으른 마크, 대출, 우리는 그에게 태그를 추가해야합니다. 물었을 때 다음 업데이트하거나 다시는 수정 된 때.
그의 아들에 할당 된 자신의 태그에 대해 첫째, 다음, 그의 아들의 마크에 대해 들어, 같은 그들의 표를 취소 : 작업을 수정 하는 경우 다음 업데이트를하거나 변경하기 전에 부탁드립니다.
푸시 다운 (게으른 태그) :
보이드 푸시 ( INT의 RT) { 경우 (트리 [RT] .lazy) { 트리 [RT << 1 ] = .COL 트리 [RT << 1 | 1 ] = .COL 트리 [RT] .lazy; 트리 [RT << 1 ] = .lazy 트리 [RT << 1 | 1 ] = .lazy 트리 [RT] .lazy; 트리 [RT] .lazy = 0 ; } 반환 ; }
AC 코드 :
사용법 #include <iostream> #INCLUDE <cstdio> #INCLUDE <ctime이> #INCLUDE <CString을> #INCLUDE <cstdlib> #INCLUDE <cmath> #INCLUDE <큐> #INCLUDE <적층> #INCLUDE <지도> #INCLUDE <알고리즘> #DEFINE 맥스 (a, b) ((a)> (b)? (a) :( b)) 로 #define 민 (a, b) ((a) <(b)? (a) :( b)) #DEFINE Mem0 (X)가 memset (X, 0는 sizeof (X)) #DEFINE MEM1 (X)가 memset (X, -1는 sizeof (X)) #DEFINE MemX (X)가 memset (X, 0x3F입니다,는 sizeof (X )) 하여 스페이스 성병; 타입 정의 롱 롱LL; CONST INT INF = 0x3f3f3f ; CONST 이중 PI ACOS = (- 1.0 ); CONST의 INT MAXN 1E5 + = 10 ; 구조체 의 { INT의 L, R; 게으른 COL LL; } 트리 [MAXN << 2 ]; INT의 L, t, O; // 长度,颜色数,询问次数 LL ANS; 보이드 BTREE ( INT의 RT, INT의 L, INT의 R) { 트리 [RT] 펜닐 =의 L; 트리 [RT] .R = R; 트리 [RT] .lazy= 0 ; 트리 [RT] .COL = 1 ; 경우 (L == R)이 { 리턴 ; } INT 중간 = (L + R) >> 1 ; BTREE (RT << 1 , L, MID); BTREE (RT << 1 | 1 중간 + 1 , R); 반환 ; } 공극 푸시 ( INT의 RT) { 경우 (트리 [RT] .lazy) { 트리 [RT << 1 ] = .COL 트리 [RT << 1 | 1 ] = .COL트리 [RT] .lazy; 트리 [RT << 1 ] = .lazy 트리 [RT << 1 | 1 ] = .lazy 트리 [RT] .lazy; 트리 [RT] .lazy = 0 ; } 반환 ; } 공극 업데이트 ( INT의 RT, int로 A, INT의 B, INT의 C)를 { 경우 (a> 트리 [RT] || .R B < 트리 [RT] 펜닐) { 리턴 ; } 다른 경우 (a <= 트리 [RT] 펜닐 && 트리 [RT] .R <= b) { 트리 [RT] .COL = 트리 [RT] .lazy = 1 << (C-1 ); 반환 ; } 푸시 (RT); 업데이트 (RT << 1 , A, B, C); 업데이트 (RT << 1 | 1 , A, B, C); 트리 [RT] .COL = 트리 [RT << 1 ] .COL | 트리 [RT << 1 | 1 ] .COL; 반환 ; } 공극 쿼리 ( INT의 RT는 int로 하는을 INT의 B)을 { 경우 (a> 트리 [RT] || .R B < 트리 [RT] 펜닐) { 리턴 ; } 다른 경우(a <= 트리 [RT] 펜닐 && 트리 [RT] .R <= b) { ANS | = 트리 [RT] .COL; 반환 ; } 푸시 (RT); 쿼리 (RT << 1 , A, B); 쿼리 (RT << 1 | 1 , A, B); 반환 ; } 찾을거야 (LL가) { INT의 TMP = 0 ; 동안 (a) { 경우 (a % 2 == 1 ) TMP ++ ; >> = 1 ; } 반환TMP; } INT 의 main () { 는 scanf ( " % D % D % D ' , L, t, O); BTREE ( 1 , 1 , l); 반면 (o-- ) { 숯 STR; int로 A, B, C를; CIN >> STR; 경우 (STR == ' C ' ) { 는 scanf ( " % D % D % D ' , A, 및 B, 및 C); 업데이트 ( 1 , A, B, C); } 다른 { scanf와 (" % d 개 %의 D ' , A, 및 B); ANS = 0 ; 경우 (a> b) 질의 ( 1 , B, A); 다른 쿼리 ( 1 , A, B); COUT은 << (ANS) << 찾을 ENDL; } } 반환 0 ; }