Skip to content

Commit 5eec499

Browse files
Create solution.java
1 parent 7c6fb30 commit 5eec499

File tree

1 file changed

+157
-0
lines changed

1 file changed

+157
-0
lines changed
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
import java.util.*;
2+
3+
class DPHelper {
4+
static final long ok = 10000000000000000L;
5+
long[][][] dp = new long[101][101][2];
6+
boolean[][][] vis = new boolean[101][101][2];
7+
8+
long compute(int o, int e, int p) {
9+
if (o == 0 && e == 0) return 1;
10+
if (vis[o][e][p]) return dp[o][e][p];
11+
12+
long r = 0;
13+
if (p == 1) {
14+
if (o == 0) r = 0;
15+
else r = o * compute(o - 1, e, 0);
16+
} else {
17+
if (e == 0) r = 0;
18+
else r = e * compute(o, e - 1, 1);
19+
}
20+
21+
if (r > ok) r = ok;
22+
vis[o][e][p] = true;
23+
dp[o][e][p] = r;
24+
return r;
25+
}
26+
}
27+
28+
class SortHelper {
29+
void sortList(ArrayList<Integer> list) {
30+
Collections.sort(list);
31+
}
32+
}
33+
34+
class PermutationHelper {
35+
List<Integer> buildPermutation(int p, ArrayList<Integer> O, ArrayList<Integer> E, long k, DPHelper d) {
36+
List<Integer> ans = new ArrayList<>();
37+
if (O.size() + E.size() == 0) return ans;
38+
int i = 0;
39+
40+
if (p == 1) {
41+
while (i < O.size()) {
42+
long cnt = d.compute(O.size() - 1, E.size(), 0);
43+
if (k > cnt) {
44+
k -= cnt;
45+
i++;
46+
} else {
47+
int x = O.get(i);
48+
O.remove(i);
49+
ans.add(x);
50+
ans.addAll(buildPermutation(0, O, E, k, d));
51+
return ans;
52+
}
53+
}
54+
} else {
55+
while (i < E.size()) {
56+
long cnt = d.compute(O.size(), E.size() - 1, 1);
57+
if (k > cnt) {
58+
k -= cnt;
59+
i++;
60+
} else {
61+
int x = E.get(i);
62+
E.remove(i);
63+
ans.add(x);
64+
ans.addAll(buildPermutation(1, O, E, k, d));
65+
return ans;
66+
}
67+
}
68+
}
69+
return ans;
70+
}
71+
72+
List<Integer> alternateFormation(ArrayList<Integer> O, ArrayList<Integer> E, long k, DPHelper d, int n, SortHelper s) {
73+
List<Integer> ans = new ArrayList<>();
74+
int tot = O.size() + E.size();
75+
if (tot % 2 == 1) {
76+
int i = 0;
77+
while (i < O.size()) {
78+
long cnt = d.compute(O.size() - 1, E.size(), 0);
79+
if (k > cnt) {
80+
k -= cnt;
81+
} else {
82+
int x = O.get(i);
83+
O.remove(i);
84+
ans.add(x);
85+
ans.addAll(buildPermutation(0, O, E, k, d));
86+
return ans;
87+
}
88+
i++;
89+
}
90+
} else {
91+
ArrayList<Integer> U = new ArrayList<>();
92+
U.addAll(O);
93+
U.addAll(E);
94+
s.sortList(U);
95+
int i = 0;
96+
while (i < U.size()) {
97+
int x = U.get(i);
98+
if (O.contains(x)) {
99+
long cnt = d.compute(O.size() - 1, E.size(), 0);
100+
if (k > cnt) {
101+
k -= cnt;
102+
} else {
103+
int idx = O.indexOf(x);
104+
O.remove(idx);
105+
ans.add(x);
106+
ans.addAll(buildPermutation(0, O, E, k, d));
107+
return ans;
108+
}
109+
} else {
110+
long cnt = d.compute(O.size(), E.size() - 1, 1);
111+
if (k > cnt) {
112+
k -= cnt;
113+
} else {
114+
int idx = E.indexOf(x);
115+
E.remove(idx);
116+
ans.add(x);
117+
ans.addAll(buildPermutation(1, O, E, k, d));
118+
return ans;
119+
}
120+
}
121+
i++;
122+
}
123+
}
124+
return ans;
125+
}
126+
}
127+
128+
class Solution {
129+
public int[] permute(int n, long k) {
130+
int o = (n + 1) / 2, e = n / 2;
131+
ArrayList<Integer> O = new ArrayList<>(), E = new ArrayList<>();
132+
133+
for (int i = 1; i <= n; i++) {
134+
if (i % 2 == 1) O.add(i);
135+
else E.add(i);
136+
}
137+
138+
SortHelper s = new SortHelper();
139+
s.sortList(O);
140+
s.sortList(E);
141+
142+
DPHelper d = new DPHelper();
143+
PermutationHelper ph = new PermutationHelper();
144+
145+
long tot = 0;
146+
if (n % 2 == 1) tot = d.compute(O.size() - 1, E.size(), 0) * O.size();
147+
else tot = d.compute(O.size() - 1, E.size(), 0) * O.size() + d.compute(O.size(), E.size() - 1, 1) * E.size();
148+
149+
if (k > tot) return new int[0];
150+
151+
List<Integer> res = ph.alternateFormation(O, E, k, d, n, s);
152+
int[] ans = new int[res.size()];
153+
for (int i = 0; i < res.size(); i++) ans[i] = res.get(i);
154+
155+
return ans;
156+
}
157+
}

0 commit comments

Comments
 (0)