BAEKJOON

BAEKJOON 22345번: 누적거리

杉山空 2022. 2. 9. 02:53
728x90

https://www.acmicpc.net/problem/22345

 

22345번: 누적 거리

KOI 나라는 수직선 위에 놓인 N개의 마을로 구성되어 있다. 이 중 i (1 ≤ i ≤ N)번째 마을은 xi 위치에 놓여 있으며 ai명이 거주 중이다. 또한 서로 다른 두 마을이 같은 위치에 놓인 경우는 없다. KOI

www.acmicpc.net

이전에 포스팅한 Stadium이라는 문제와 매우 유사하다.

다만 이 문제에서는 x좌표가 정렬이 되어있지 않으므로 정렬을 해주어야 한다.

그리고 주어지는 후보지점에서의 값을 계산해주면 된다.

 

Stadium에서는 변화량에 집중하였다면 이번에는 그냥 계산하면 된다.

누적 거리를 구하기 위해서는 각 쿼리가 어떠한 두 마을 사이에 있는지 알아야 하며, 이를 이분탐색을 통해 찾아준다.

 

각 쿼리에 대한 누적 거리의 계산을 상수시간에 처리하기 위해 전처리를 조금 해주어야 한다.

 

x좌표를 기준으로 정렬한 후, 각 마을마다 a_i와 x_i를 곱한 값을 누적하여 더해준다. 이는 왼쪽에서부터, 오른쪽에서부터 따로 저장하여 둔다.

 

이제 계산만 하면 된다. 나머지는 아래 코드를 참고하기 바란다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<bits/stdc++.h>
#define F(N) for(int i=1;i<=N;i++)
using namespace std;
const int r=2e5+3;
struct w{long long x,a;}A[r];
inline bool c(w d,w f){return d.x<f.x;}
long long L[r],R[r],S[r],X[r],N,Q,q,p,t;
int main(){
    scanf("%lld%lld",&N,&Q);
    F(N)scanf("%lld%lld",&A[i].a,&A[i].x);
    sort(A+1,A+1+N,c);
    F(N){X[i]=A[i].x;t=N-i+1;S[i]=S[i-1]+A[i].a;L[i]=L[i-1]+A[i].a*A[i].x;R[t]=R[t+1]+A[t].a*A[t].x;}
    F(Q){
        scanf("%lld",&q);
        p=lower_bound(X+1,X+N+1,q)-X;
        printf("%lld\n",q*S[p-1]-L[p-1]+R[p]-q*(S[N]-S[p-1]));
    }
    return 0;
}
cs
728x90

'BAEKJOON' 카테고리의 다른 글

BAEKJOON 2252번: 줄세우기  (0) 2022.03.01
BAEKJOON 8913번: 문자열 뽑기  (0) 2022.02.26
BAEKJOON 9002번: Match Maker  (0) 2022.02.23
BAEKJOON 2482번: 색상환  (0) 2021.12.21
BAEKJOON 2315번: 가로등 끄기  (0) 2021.12.20