티스토리 뷰

 각 작업을 1번부터 N번까지 한번에 1초씩 실행시킬 때, 각 작업이 언제 완료되는지 구하는 문제다.

이 문제는 작업의 양이 적은 순으로 보면 된다. 직접 써보면 규칙을 찾을 수 있다.

총 걸린 시간 - 내 뒤에 남은 작업을 하면 내가 끝나는 시간을 알 수 있다..!


이 때 총 걸린 시간은 

if(현재 작업 시간 != 이전 작업 시간)

==> 이전에 총 걸린 시간 + 남은 작업*(현재 작업의시간 - 이전 작업의 시간)이다


이것만 안다면 인덱스 트리로 문제를 풀 수있다..!


소스코드

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
#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
#define MAXN 100010
ll tree[MAXN], ans[MAXN], n;
pair<ll, ll> arr[MAXN];
ll sum(int x) {
    ll ret = 0;
    for (int i = x; i > 0; i -= (i&-i)) ret += tree[i];
    return ret;
}
void update(int x,ll val) {
    for (int i = x; i <= n; i += (i&-i)) tree[i] += val;
}
int main() {
    scanf(" %lld"&n);
    for (int i = 1; i <= n; i++) {
        ll x; scanf(" %lld"&x);
        update(i,(ll)1);
        arr[i] = { x,(ll)i };
    }
    sort(arr + 1, arr + n + 1);
    ll tsum = 0, prev = 0, pos = 0;
    for (int i = 1; i <= n; i++) {
        pos = arr[i].first;
        if(prev != pos)     tsum += sum(n)*(pos - prev);
        ans[arr[i].second] = tsum - (sum(n) - sum(arr[i].second));
        update(arr[i].second,-1);
        prev = pos;
    }
    for (int i = 1; i <= n; i++printf("%lld\n", ans[i]);
}
cs


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

[백준] 9426 중앙값 측정  (0) 2018.06.22
[백준] 5012 불만정렬  (2) 2018.06.22
[백준] 11658 구간 합 구하기 3  (0) 2018.06.19
[백준] 9466 텀 프로젝트  (0) 2018.06.18
[백준] 2336 굉장한 학생  (0) 2018.06.17
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함