문제에 루오 구 P1816 충성도 솔루션

제목 설명

서번트는 스마트하고있는 사람입니다. 그는 분명 자신의 계정을하기 위해 전체 부자, 부자로 10 년 동안 일했다. 요구 사항 집사 K 시간을 하루에 계정, 스마트하고있는 집사, 가정부를 기억하고, 따라서 항상 풍부한 만족합니다. 그러나, 일부 도발에, 부자 또는 가정부는 의심을했다. a의 계좌 번호가 b에 : 그래서 그는 각 번호 1, 2에 따라 충실한 청지기에게 자신의 계정을 결정하는 특별한 방법을 사용하기로 결정, ..., 때때로 다음 가정부 문제를 질문, 문제는 그런 것입니다 최소 합계는 무엇입니까? 가정부는 그는 항상 잘못된 문제였다 번 이상 물어 시간이 없었다 수 있도록하기 위해.

입력 형식

첫 번째 행은 문제가 N이 N을 나타내고 있고, N <= 100,000 개의 입력 번호 m을 가지며, N (m <= 100,000) T 계정 m을 나타냈다.

돈 계정의 두 번째 행 번호 m, 각각 수

N n은 뒷줄에 문제가 있으며, 각 행은 두 인물이 계정의 수의 종말의 시작을 보여있다.

출력 형식

각 질문에 대한 답에 대한 출력 파일. 구체적인 예를 볼 수 있습니다.

샘플 입출력

입력 # 1
10 3 
1 2 3 4 5 6 7 8 9 10 
2 7 
3 9 
110
출력 # 1
1 2 3

문제 해결

이 세그먼트 템플릿 트리의 주제이다. : 나는 템플릿에서 트리 라인을 참조 https://baijiahao.baidu.com/s?id=1605870136961096251&wfr=spider&for=pc . 원래의 템플릿은 합산 범위 세그먼트 현재 최소 간격이다.

1 #INCLUDE <iostream>
 2 #INCLUDE <STDIO.H>
 3 #INCLUDE <math.h>
 4 #INCLUDE <알고리즘>
 5 #INCLUDE < 문자열 .H>
 6  #DEFINE 줄게 긴 긴
 7  
8  CONST의  INT MAXN = 1,000,001 ;
9  
10  이용한  스페이스 성병;
11  
12 LL의 N, M, A [MAXN, ANS [MAXN << 2 ] 태그 [MAXN << 2 ];
13  
14  LL의 LS (LL의 X)
 15  {
 16      리턴 X << 1 ;
17  }
 18  
19  LL 중계국 (LL의 X)
 20  {
 21      리턴 X << 1 | 1 ;
22  }
 23  
24  공극 push_up (LL 피)
 25  {
 26      ANS [P] = 분 (ANS [LS (p)], ANS [RS (p)]);
27  }
 28  
29  공극 빌드 (LL의 P, LL의 L, LL의 등록 상표)
 30  {
 31      태그 [P] = 0 ;
32      경우 (L == R)
 33  {
 34    ANS [P]가 = A [L]을;
35    반환;
36  }
 37      LL 중간 = (L +의 연구) >> 1 ;
38      빌드 (LS (P), 리터, 미드);
39      빌드 (RS (p), 미드 + 1 , R);
40      push_up (p);
41  } 
 42  
43  공극 F (LL의 P, LL의 L, LL R, K의 LL)
 44  {
 45      태그 [P] = 태그 [P] + K;
46      ANS [P] = ans에 [P] + k 값 * (R - L + 1 );
47  }
 48  
49  공극 push_down (LL의 P, LL의 L, LL의 등록 상표)
 50  {
 51      LL 중간 = (L + R) >> 1 ;
52      ℉ (LS (p), (L), 중간 태그 [P]);
53      F (RS (p), 미드 + 1 , R 태그 [P]);
54      [P]가 태그 = 0 ;
55  }
 56  
57  LL 쿼리 (LL의 q_x, LL q_y, LL의 L, LL R, P는 LL)
 58  {
 59      LL 입술 = 922,337,203,685,477,580 ;
60      의 경우 (q_x <= 1 && R <= q_y)
 61  {
 62    반환 ANS [P];
63  }
 64      LL 중간 = (L +의 연구) >> 1 ;
65      push_down (P, L, R);
66      의 경우 (q_x <= MID)
67  {
 68    입술 = 분 (입술, 쿼리 (q_x, q_y, L, 중간, LS (p)));
(69)  }
 (70)      의 경우 (q_y> MID) 
 71  {
 72    입술 = 분 (입술, 쿼리 (q_x, q_y 중간 + 1 , R, RS (p)));
73  }
 74      리턴 입술;
75  }
 76  
77  INT 주 ()
 78  {
 79       LL의 E, F;
80      는 scanf ( " %의 LLD의 %의 LLD " , N, m);
81       (LL 난 = 1 ; 나는 <= N; ++ i가 )
82      {
 83          는 scanf ( " %의 LLD " , & A [I]);
84      }
 85      빌드 ( 1 , 1 , N);
86       (LL I = 1 ; i가 <= m; 내가 ++ )
 87      {
 88          는 scanf ( " %의 LLD의 %의 LLD " , E, F);
89          의 printf ( " %의 LLD ' , F 질의 (즉, 1 N, 1 ));
90      }
 91      반환  0 ;
(92) }

 

추천

출처www.cnblogs.com/zealsoft/p/11559835.html