Skip to content

Commit f999b69

Browse files
committed
modify code
1 parent 0762169 commit f999b69

File tree

2 files changed

+81
-14
lines changed

2 files changed

+81
-14
lines changed

src/class182/Code01_LeadersGroup1.java

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,16 @@
1515
import java.io.InputStream;
1616
import java.io.OutputStreamWriter;
1717
import java.io.PrintWriter;
18+
import java.util.Arrays;
1819

1920
public class Code01_LeadersGroup1 {
2021

2122
public static int MAXN = 200001;
22-
public static int MAXV = 1000000000;
23-
public static int MAXT = MAXN * 40;
23+
public static int MAXT = MAXN * 20;
2424
public static int n;
2525
public static int[] arr = new int[MAXN];
26+
public static int[] sorted = new int[MAXN];
27+
public static int cntv;
2628

2729
public static int[] head = new int[MAXN];
2830
public static int[] nxt = new int[MAXN];
@@ -36,6 +38,20 @@ public class Code01_LeadersGroup1 {
3638
public static int[] addTag = new int[MAXT];
3739
public static int cntt;
3840

41+
public static int kth(int num) {
42+
int left = 1, right = cntv, mid, ret = 0;
43+
while (left <= right) {
44+
mid = (left + right) >> 1;
45+
if (sorted[mid] <= num) {
46+
ret = mid;
47+
left = mid + 1;
48+
} else {
49+
right = mid - 1;
50+
}
51+
}
52+
return ret;
53+
}
54+
3955
public static void addEdge(int u, int v) {
4056
nxt[++cntg] = head[u];
4157
to[cntg] = v;
@@ -124,14 +140,31 @@ public static int merge(int l, int r, int t1, int t2, int max1, int max2) {
124140
}
125141

126142
public static void dp(int u) {
127-
int val = 0;
143+
int sum = 0;
128144
for (int e = head[u]; e > 0; e = nxt[e]) {
129145
int v = to[e];
130146
dp(v);
131-
val += query(arr[u], MAXV, 1, MAXV, root[v]);
132-
root[u] = merge(1, MAXV, root[u], root[v], 0, 0);
147+
sum += query(arr[u], cntv, 1, cntv, root[v]);
148+
root[u] = merge(1, cntv, root[u], root[v], 0, 0);
149+
}
150+
root[u] = update(arr[u], sum + 1, 1, cntv, root[u]);
151+
}
152+
153+
public static void prepare() {
154+
for (int i = 1; i <= n; i++) {
155+
sorted[++cntv] = arr[i];
156+
}
157+
Arrays.sort(sorted, 1, cntv + 1);
158+
int len = 1;
159+
for (int i = 2; i <= cntv; i++) {
160+
if (sorted[len] != sorted[i]) {
161+
sorted[++len] = sorted[i];
162+
}
163+
}
164+
cntv = len;
165+
for (int i = 1; i <= n; i++) {
166+
arr[i] = kth(arr[i]);
133167
}
134-
root[u] = update(arr[u], val + 1, 1, MAXV, root[u]);
135168
}
136169

137170
public static void main(String[] args) throws Exception {
@@ -145,8 +178,9 @@ public static void main(String[] args) throws Exception {
145178
fa = in.nextInt();
146179
addEdge(fa, i);
147180
}
181+
prepare();
148182
dp(1);
149-
out.println(query(1, MAXV, 1, MAXV, root[1]));
183+
out.println(query(1, cntv, 1, cntv, root[1]));
150184
out.flush();
151185
out.close();
152186
}

src/class182/Code01_LeadersGroup2.java

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@
1717
//using namespace std;
1818
//
1919
//const int MAXN = 200001;
20-
//const int MAXV = 1000000000;
21-
//const int MAXT = MAXN * 40;
20+
//const int MAXT = MAXN * 20;
2221
//int n;
2322
//int arr[MAXN];
23+
//int sorted[MAXN];
24+
//int cntv;
2425
//
2526
//int head[MAXN];
2627
//int nxt[MAXN];
@@ -34,6 +35,20 @@
3435
//int addTag[MAXT];
3536
//int cntt;
3637
//
38+
//int kth(int num) {
39+
// int left = 1, right = cntv, ret = 0;
40+
// while (left <= right) {
41+
// int mid = (left + right) >> 1;
42+
// if (sorted[mid] <= num) {
43+
// ret = mid;
44+
// left = mid + 1;
45+
// } else {
46+
// right = mid - 1;
47+
// }
48+
// }
49+
// return ret;
50+
//}
51+
//
3752
//void addEdge(int u, int v) {
3853
// nxt[++cntg] = head[u];
3954
// to[cntg] = v;
@@ -122,14 +137,31 @@
122137
//}
123138
//
124139
//void dp(int u) {
125-
// int val = 0;
140+
// int sum = 0;
126141
// for (int e = head[u]; e; e = nxt[e]) {
127142
// int v = to[e];
128143
// dp(v);
129-
// val += query(arr[u], MAXV, 1, MAXV, root[v]);
130-
// root[u] = merge(1, MAXV, root[u], root[v], 0, 0);
144+
// sum += query(arr[u], cntv, 1, cntv, root[v]);
145+
// root[u] = merge(1, cntv, root[u], root[v], 0, 0);
146+
// }
147+
// root[u] = update(arr[u], sum + 1, 1, cntv, root[u]);
148+
//}
149+
//
150+
//void prepare() {
151+
// for (int i = 1; i <= n; i++) {
152+
// sorted[++cntv] = arr[i];
153+
// }
154+
// sort(sorted + 1, sorted + cntv + 1);
155+
// int len = 1;
156+
// for (int i = 2; i <= cntv; i++) {
157+
// if (sorted[len] != sorted[i]) {
158+
// sorted[++len] = sorted[i];
159+
// }
160+
// }
161+
// cntv = len;
162+
// for (int i = 1; i <= n; i++) {
163+
// arr[i] = kth(arr[i]);
131164
// }
132-
// root[u] = update(arr[u], val + 1, 1, MAXV, root[u]);
133165
//}
134166
//
135167
//int main() {
@@ -143,7 +175,8 @@
143175
// cin >> fa;
144176
// addEdge(fa, i);
145177
// }
178+
// prepare();
146179
// dp(1);
147-
// cout << query(1, MAXV, 1, MAXV, root[1]) << '\n';
180+
// cout << query(1, cntv, 1, cntv, root[1]) << '\n';
148181
// return 0;
149182
//}

0 commit comments

Comments
 (0)