Skip to content

Commit 1e87689

Browse files
authored
Merge pull request #200 from AlgorithmWithGod/ShinHeeEul
[20250304] BOJ / P4 / 순열 / 신희을
2 parents 4c08b0e + ca9d689 commit 1e87689

File tree

1 file changed

+109
-0
lines changed

1 file changed

+109
-0
lines changed
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
```java
2+
import java.util.*;
3+
import java.io.*;
4+
5+
public class Main {
6+
7+
static int[] segments;
8+
static int size;
9+
static int N;
10+
public static void main(String[] args) throws Exception {
11+
N = read();
12+
13+
size = 1;
14+
15+
while(size < N) {
16+
size <<= 1;
17+
}
18+
19+
segments = new int[(size << 1) + 1];
20+
21+
22+
// 빈공간들의 합을 올리고
23+
24+
int segmentSize = size << 1;
25+
while(segmentSize > 1) {
26+
if(segmentSize > size) {
27+
segments[segmentSize >> 1] = 2;
28+
segmentSize-=2;
29+
}
30+
else {
31+
segments[(segmentSize >> 1)] = segments[segmentSize] + segments[segmentSize - 1];
32+
segmentSize -= 2;
33+
}
34+
}
35+
36+
for(int i = 1; i <= N; i++) {
37+
int A = read();
38+
update(A, i);
39+
}
40+
41+
StringBuilder sb = new StringBuilder();
42+
43+
for(int i = size + 1; i < size + N + 1; i++) {
44+
sb.append(segments[i]).append("\n");
45+
}
46+
47+
System.out.println(sb);
48+
49+
50+
}
51+
52+
public static void update(int A, int idx) {
53+
54+
// 2에서부터 내려가면서
55+
int index = 2;
56+
57+
while(true) {
58+
59+
// 거치는 애들 -1
60+
segments[index]--;
61+
int doubleIndex = index << 1;
62+
int doubleIndexMinusOne = doubleIndex - 1;
63+
// size보다 커지면? 해당 위치에 idx를 넣고 종료
64+
if(index > (size >> 1)) {
65+
if(A == 1) {
66+
segments[doubleIndex] = idx;
67+
} else {
68+
if(segments[doubleIndexMinusOne] != 0) {
69+
segments[doubleIndex] = idx;
70+
} else {
71+
segments[doubleIndexMinusOne] = idx;
72+
}
73+
}
74+
return;
75+
}
76+
77+
// 좌측보다 크거나 같다?
78+
int left = segments[doubleIndexMinusOne];
79+
80+
if(A >= left) {
81+
// 좌측만큼 빼주고
82+
A -= left;
83+
// 우측으로 이동
84+
index = doubleIndex;
85+
}
86+
87+
// 나머지 경우?
88+
// 좌측으로 이동
89+
else {
90+
index = doubleIndexMinusOne;
91+
}
92+
}
93+
}
94+
95+
private static int read() throws Exception {
96+
int d, o;
97+
d = System.in.read();
98+
99+
o = d & 15;
100+
101+
while ((d = System.in.read()) > 32)
102+
o = (o << 3) + (o << 1) + (d & 15);
103+
104+
return o;
105+
}
106+
107+
}
108+
109+
```

0 commit comments

Comments
 (0)