-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy path1517.java
More file actions
77 lines (60 loc) · 1.88 KB
/
Copy path1517.java
File metadata and controls
77 lines (60 loc) · 1.88 KB
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// Copyright@2023 Jihoon Lucas Kim <jihoon.lucas.kim@gmail.com>
// 버블 소트
// https://www.acmicpc.net/problem/1517
// 힌트
// 1. 버블 소트로 문제를 풀면 O(N^2)로 시간 초과
// 2. 버블 소트는 수열의 왼쪽에 있는 수가 오른쪽에 있는 수보다 몇개나 더 큰지 알아내면 됨.
// 3. 합병정렬(merge sort)를 통해 정렬을 하며, 정렬 중 왼쪽에 있는 수가 오른쪽에 있는
// 수보다 몇개가 더 큰지 계산하여 더해줌
// 4. 합병정렬의 시간복잡도는 O(nlogn)으로 시간내에 통과가능
import java.io.*;
import java.util.*;
public class Main {
static long answer;
static long[] numbers;
static long[] temp;
static void merge(int left, int middle, int right) {
int i = left;
int j = middle + 1;
int index = left;
while (i <= middle && j <= right) {
if (numbers[i] <= numbers[j]) {
temp[index++] = numbers[i++];
} else {
temp[index++] = numbers[j++];
answer += (middle + 1 - i);
}
}
while (i <= middle) {
temp[index++] = numbers[i++];
}
while (j <= right) {
temp[index++] = numbers[j++];
}
for (int k = left; k <= right; k++) {
numbers[k] = temp[k];
}
}
static void mergeSort(int left, int right) {
if (left >= right) {
return;
}
int middle = (left + right) / 2;
mergeSort(left, middle);
mergeSort(middle + 1, right);
merge(left, middle, right);
}
public static void main(String[] args) throws IOException, NumberFormatException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
numbers = new long[N];
temp = new long[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
numbers[i] = Long.parseLong(st.nextToken());
}
answer = 0;
mergeSort(0, N - 1);
System.out.println(answer);
}
}