본문 바로가기

알고리즘 관련/BOJ

BOJ)9426 중앙값 측정

문제: icpc.me/9426


n개의 수열이 있을 때 K의 연속 부분 수열의 중앙값의 합을 구하는 문제이다.


앞에서부터 K개의 수를 세그먼트 트리에 업데이트 시켜준 후 N까지 1개씩 지우고 업데이트 시켜주면서 중앙값을 구해주면 된다.


중앙값은 앞에서부터 (k+1)/2 수를 찾으면 된다.


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 <cstdio>
#include <algorithm>
#define MAX_N 250001
#define MAX 65536
using namespace std;
typedef long long ll;
ll seg[* MAX_N], a[MAX_N], n, k, res;
ll update(ll pos, ll val, ll node, ll x, ll y) {
    if (y < pos || pos < x)
        return seg[node];
    if (x == y)return seg[node] += val;
    ll mid = (x + y) >> 1;
    return seg[node] = update(pos, val, node * 2, x, mid) + update(pos, val, node * + 1, mid + 1, y);
}
ll query(ll val, ll node, ll x, ll y) {
    ll mid = (x + y) >> 1;
    if (x == y)return x;
    if (seg[node * 2>= val)return query(val, node * 2, x, mid);
    return query(val - seg[node * 2], node * + 1, mid + 1, y);
}
int main() {
    scanf("%lld%lld"&n, &k);
    for (int i = 0; i < n; i++) {
        scanf("%lld"&a[i]);
    }
    for (int i = 0; i < k - 1; i++
        update(a[i], 110, MAX - 1);
    for (int i = k - 1; i < n; i++) {
        update(a[i], 110, MAX - 1);
        res += query((k + 1/ 210, MAX - 1);
        update(a[i - k + 1], -110, MAX - 1);
    }
    printf("%lld", res);
    return 0;
}
cs


'알고리즘 관련 > BOJ' 카테고리의 다른 글

BOJ)3002 아날로그 다이얼  (0) 2017.01.11
BOJ)1168 조세퍼스 문제2  (0) 2017.01.11
BOJ)5676 음주 코딩  (0) 2017.01.10
BOJ)12016 라운드 로빈 스케줄러  (0) 2017.01.10
BOJ)3653 영화 수집  (0) 2017.01.10