또 다른 세그먼트 트리 등불 축제

 

 

 

 사실, 나도 몰라 & 당신은 무엇을 의미합니까 때문에 나는 그것을하지 않았다이 주제의 시작, 나는 그것이라고 생각 플러스와

이 문제는 실제로 배열을 구성 할 수 있도록하기위한 것입니다, 그것은 비트의 수와 간격에있어서의 갈등하지 않습니다를 참조하십시오.

다루기 쉬운 후, 각 쿼리 0 배열을 만들 것을 알고 | 그것, 비트 다음 쿼리 간격 및 문자를 충족하지 않는 경우 참조]

왜 |합니까?

이것은 &의 작동을 고려하는 방법이다

이진 비트에서는 두 번호 만에 1 비트 정도로 매우 분명한 문제가, 숫자에서 반드시 모든 구간 수와 동일하지 않으며, 1 (1) 밖으로있다

라인에 | 그러나 그들의 쓰레기통에, 일정한 수의 비트에서 쿼리가 해당 비트의 수를 조회 할 때마다, 그래서 동일

그리고 보드가 트리 라인이 바로 여기 펜윅 트리를 사용할 수 없습니다입니다 이유에 대해 생각

1 #INCLUDE <cstdio>
 2 #INCLUDE <CString을>
 3 #INCLUDE <알고리즘>
 4  하여  공간을 성병;
5  CONST의  INT N = + 1E6 (10) ;
6 타입 정의  LL;
7  LL 트리 [N], 지연 [N];
8  공극 updata ( INT의 RT, INT (L), INT (R), w LL) {
 9      트리 [RT] = 트리 [RT] | w;
10      게으른 [RT] = 나무 [RT] | w;
11  }
 12  무효 푸시 ( INTRT, INT의 L, INT R) {
 13      INT의 중간 = L + R >> 1 ;
14      updata (RT << 1 , L, 중간, 지연 [RT]);
15      updata (RT << 1 | 1 중간 + 1 , R, 지연 [RT]);
16      지연 [RT] = 0 ;
17  }
 18  보이드 수정 ( INT의 RT, INT (L), INT (R), INT (S), INT t, w LL) {
 도 19      의 경우 (S <= 1 && R <= t) {
 20          updata (RT, L, R, W);
21          ;
22      }
 23      푸시 (RT, L, R);
24      INT의 중간 = L + R >> 1 ;
25      의 경우 (S <= MID) 수정 (RT << 1 , L, 중, S, t, w);
26 일      경우 (t> MID), 수정 (RT << 1 | 1 중간 + 1 , R, S, T, w);
27      트리 [RT] = 트리 [RT << 1 ] 트리 [RT << 1 | 1 ];
28  }
 29 LL 쿼리 ( INT의 RT, INT (L), INT (R), INT (S), INT t) {
30      의 경우 (S <= 1 && t> = R) 복귀 트리 [RT];
31      푸시 (RT, L, R);
32      INT의 중간 = L + R >> 1 ;
33      의 경우 (t <= MID) 리턴 질의 (RT << 1 , L, 중, S, t);
(34)      그 밖의  경우 (S> MID) 리턴 질의 (RT << 1 | 1 중간 + 1 , R, S, T);
35      다른  리턴 질의 (RT << 1 , L, 중, S, T)을 쿼리 (RT << 1 | 1 중간 + 1 , R, S, T);
36  }
 37  INT주 () {
 38      의 INT m, N, t; bool에 플래그를;
39 개      freopen을 ( " kuai.in " , " R " , 표준 입력);
40 개      freopen을 ( " kuai.out " , " w " , 표준 출력);
41      는 scanf ( " %의 D " , t);
42      동안 (t-- ) {
 43          플래그 = 1 ;
44          memset 함수 (트리 0 , 는 sizeof (트리));
45          는 scanf (" % D % D " , 및 N, m);
46           ( INT 나 = 1 ; i가 <= m; I ++ ) {
 47              INT의 L, R;
48              LL w;
49              는 scanf ( " % D % % LLD D " , 및 & L, R w);
50              수정 ( 1 , 1 , N, L, R, W);
51 개              LL 데이터 쿼리 = ( 1 , 1 , N, L, R);
52              의 경우 (! 데이터 = w) 플래그 = 0 ;
(53)          }
 (54)          의 경우 (플래그)의 printf (" YES \ n " );
55          사람 의 printf ( " NO \ n " );
56      }
 57      반환  0 ;
58 }

 

추천

출처www.cnblogs.com/anyixing-fly/p/12433619.html