문제의 의미
사용자는 (1 ≤ N ≤ 3 · 1E5) 시퀀스 m (1 ≤ P ≤ 3 · 1E5) 질의, 요구마다 A, A +의 B, A + 2B + ... <= N의 N 길이 수득 과
사고
스타트는 방법 분, 실제로 블록은 블록 순서는 또한 데이터, 특정 관행의 다음과 같은 논의의 블록으로 나눌 수 있습니다 될 수 있다는 것을 알고하지 않았다 설명을 읽고 어떤 정보를 유지하는 수 잉태하지되었습니다
첫째,이 질문은 오프라인 대형 소형에서, 먼저 쿼리를 읽고, 쿼리를 수행하는 온라인 요구되지
① 놓으면 <√N 때, 사전-B의 각각에 대한 우리 같은 배열의 합 [I] 내가 시퀀스와 (당신이 찾아 DP 간단한을 사용할 수 있습니다)와 O (1) 쿼리가 이렇게의 장점은 다른이 같은 B, 우리를 통해 정렬 할 수 있다면 다른 요청하는 것입니다 b를 그것은 시작 지점 간격으로 걸릴 것입니다 이러한 직접 합 배열을 이용하여 시간 복잡도는 O (n√n).
② b≥√n, 직접 폭력 합산 시간 복잡도는 O 인 경우 (m√n)
O의 총 시간 복잡도 ((m + n)이 너무 √n )
사용법 #include <iostream> #INCLUDE <알고리즘> #INCLUDE <cmath> 사용 공간을 성병; CONST INT maxn = 3e5 + (10) ; 형식 정의를 오래 오래 LL; LL A [maxn]; 구조체 노드 { INT의 A, B ID; 부울 연산자 <( CONST 노드들) CONST { 반환 B < SB를; } B} [maxn]; LL의 ANS [maxn]; [maxn] sum_b 것이다; int 형 ) (주 { INT의 N, m; scanf와 ( " %의 D ' , N); INT BL = SQRT (N); 위한 ( INT 난 = 1 ; I <= N; I ++ ) scanf와 ( " % I64d " , & A [I]); scanf와 ( " %의 D ' , m); 위한 ( INT 나 = 1 ; I <= m; I ++ ) { B [i]를 .ID = I; scanf와 ( " % D % D ' , B [i]를 .A, B [I] .B); } 정렬 (B + 1 , B + 1 + m); B [ 0 ] .B = 0 ; 위한 ( INT 나 = 1 ; I <= m; I ++ ) { 경우 (b [I] .B> = BL) { ANS [B [I] .ID] = 0 ; 대 ( INT의 K = B [i]를 .A] K <= N, K + = B [i]를 .B) ANS [B [I] .ID] + = A [K]; } 또 { 경우 (b [I] .B == B [I- 1 ] .B) { ANS [B [I] .ID] = sum_b [B [I] .A]; } 또 { 대 ( INT J = N; J> = 1 ; j-- ) 만약 (j + B [I] .B> N) sum_b [J]를 = A [J]을; 다른 sum_b [J] = sum_b [J + B [I] .B] + A [J]; ANS [B [I] .ID] = sum_b [B [I] .A]; } } } 위한 ( INT 난 = 1 ; I <= m; I ++ ) 의 printf ( " % I64d \ n " , ANS [I]); 반환 0 ; }