※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 23327번 문제인 리그전 오브 레전드이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/23327
23327번: 리그전 오브 레전드
첫 번째 줄에 참가를 원하는 팀의 수 $N$($2 \le N \le 100 \, 000$), 후보 디비전의 개수 $Q$($1 \le Q \le 200 \, 000$)가 주어진다. 두 번째 줄에 정수 $a_1, a_2, \dots, a_N$이 주어진다. $a_i$는 $i$번째로 잘하는
www.acmicpc.net
a1, a2, ..., ak의 원소들이 있을 때 서로 (인덱스가) 다른 두 원소의 곱의 합은 (a1+a2+...+ak)^2 에서 (a1^2+a2^2+...+ak^2)을 빼는 것으로 계산해낼 수 있다. 단, 이 곱에는 a1*a2와 a2*a1과 같이 두 원소의 곱을 순서를 바꿔 더해 총 두번씩 들어있으므로 문제의 답은 위에서 계산한 값의 절반이 된다.
단순 누적합과 각 원소의 제곱의 누적합을 미리 전처리해 문제를 빠르게 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
typedef long long ll;
int N, Q;
ll psum1[100001]; // 누적합
ll psum2[100001]; // 제곱의 누적합
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> Q;
for (int i = 1; i <= N; i++) {
ll x; cin >> x;
psum1[i] = psum1[i - 1] + x;
psum2[i] = psum2[i - 1] + x * x;
}
while (Q--) {
int L, R; cin >> L >> R; L--;
cout << ((psum1[R] - psum1[L]) * (psum1[R] - psum1[L]) - (psum2[R] - psum2[L])) / 2 << '\n';
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 27268 // C++] Рамки (0) | 2023.01.23 |
---|---|
[BOJ 25204 // C++] 문자열 정렬 (0) | 2023.01.22 |
[BOJ 23326 // C++] 홍익 투어리스트 (0) | 2023.01.21 |
[BOJ 27259 // C++] Разноцветные диагонали (0) | 2023.01.21 |
[BOJ 27226 // C++] Лестница из чисел (0) | 2023.01.20 |