LoCeL
[KOI'18] XCorr 본문
문제는 여기에서 확인 가능하다.
주어진 두 수 $a$, $b$에 대해서 $\sum_{a \leq t \leq b} XCorr(t)$를 계산할 때, $x_i$와 곱해지는 $y_j$들을 생각하자. $p_i = max(0, i+a), q_i = min(n-1, i+b)$라고 하면 $x_i$와 곱해지는 $y_j$들은 $y_{p_i}, y_{p_1+1}, ..., y_{q_i}$가 됨을 알 수 있다. 따라서 구하고자 하는 것을 다음과 같이 바꿀 수 있다.
$$\sum_{a \leq t \leq b} XCorr(t) = \sum_{i = 0}^{n-1} {\sum_{j = p_i}^{q_i} {x_i y_i}}$$
이때 $\sum_{j = p_i}^{q_i} {y_i}$는 전처리를 통해서 $O(\log M)$에 구할 수 있으므로, 전체 시간복잡도 $O(N \log M)$에 답을 구할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include<bits/stdc++.h> using namespace std; typedef long long int lld; typedef pair<int, lld> pil; int N, M; lld presum[300005], Xi[300005], X[300005], Yi[300005], Y[300005]; lld rst, a, b; void input() { cin >> N; for(int i = 1; i <= N; i++) cin >> Xi[i] >> X[i]; cin >> M; for(int i = 1; i <= M; i++) cin >> Yi[i] >> Y[i]; cin >> a >> b; } void f() { for(int i = 1; i <= M; i++) presum[i] = Y[i] + presum[i-1]; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); input(); f(); for(int i = 1; i <= N; i++) { int tmp = presum[upper_bound(Yi+1, Yi+M+1, Xi[i] + b) - Yi - 1] - presum[lower_bound(Yi+1, Yi+M+1, Xi[i]+a) - Yi - 1]; rst += tmp*X[i]; } cout << rst; return 0; } | cs |
'PS' 카테고리의 다른 글
[BOJ 17594] Stop Counting! (0) | 2020.08.04 |
---|---|
[UCPC 2019] 이사 풀이 (0) | 2019.08.01 |
[BOJ 7347] 플립과 시프트 (0) | 2018.11.09 |
[KOI'09] 섞기 수열 (0) | 2018.11.09 |
[IOI'18] COMBO (0) | 2018.09.11 |
Comments