Skip to content

Commit eb692e6

Browse files
committed
modify code
1 parent 8b42a08 commit eb692e6

File tree

3 files changed

+167
-14
lines changed

3 files changed

+167
-14
lines changed

src/class182/Code01_LeadersGroup1.java

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
package class182;
22

33
// 领导集团问题,java版
4+
// 一共有n个节点,给定每个点的点权,所有节点组成一棵树
5+
// 已知1号节点是整棵树的头,其他节点的父亲节点都会给出
6+
// 如果你在树上选择了u、v两个节点,并且u是v的祖先节点的话
7+
// 那么需要保证 u的点权 <= v的点权,除此之外就没有别的限制了
8+
// 打印你最多能在树上选择几个点
9+
// 1 <= n <= 2 * 10^5
10+
// 0 <= 点权 <= 10^9
411
// 测试链接 : https://www.luogu.com.cn/problem/P4577
512
// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例
613

@@ -25,7 +32,7 @@ public class Code01_LeadersGroup1 {
2532
public static int[] root = new int[MAXN];
2633
public static int[] ls = new int[MAXT];
2734
public static int[] rs = new int[MAXT];
28-
public static int[] max = new int[MAXT];
35+
public static int[] maxv = new int[MAXT];
2936
public static int[] addTag = new int[MAXT];
3037
public static int cntt;
3138

@@ -36,15 +43,12 @@ public static void addEdge(int u, int v) {
3643
}
3744

3845
public static void up(int i) {
39-
max[i] = Math.max(max[ls[i]], max[rs[i]]);
46+
maxv[i] = Math.max(maxv[ls[i]], maxv[rs[i]]);
4047
}
4148

4249
public static void lazy(int i, int v) {
43-
// 如果区间信息不存在
44-
// 说明没有建立过dp信息
45-
// 那么不需要增加v
4650
if (i != 0) {
47-
max[i] += v;
51+
maxv[i] += v;
4852
addTag[i] += v;
4953
}
5054
}
@@ -63,7 +67,7 @@ public static int add(int jobi, int jobv, int l, int r, int i) {
6367
rt = ++cntt;
6468
}
6569
if (l == r) {
66-
max[rt] = Math.max(max[rt], jobv);
70+
maxv[rt] = Math.max(maxv[rt], jobv);
6771
} else {
6872
down(rt);
6973
int mid = (l + r) >> 1;
@@ -88,12 +92,12 @@ public static int merge(int l, int r, int t1, int t2, int max1, int max2) {
8892
return t1 + t2;
8993
}
9094
if (l == r) {
91-
max[t1] = Math.max(max[t1], max1) + Math.max(max[t2], max2);
95+
maxv[t1] = Math.max(maxv[t1], max1) + Math.max(maxv[t2], max2);
9296
} else {
9397
down(t1);
9498
down(t2);
9599
int mid = (l + r) >> 1;
96-
ls[t1] = merge(l, mid, ls[t1], ls[t2], Math.max(max1, max[rs[t1]]), Math.max(max2, max[rs[t2]]));
100+
ls[t1] = merge(l, mid, ls[t1], ls[t2], Math.max(max1, maxv[rs[t1]]), Math.max(max2, maxv[rs[t2]]));
97101
rs[t1] = merge(mid + 1, r, rs[t1], rs[t2], max1, max2);
98102
up(t1);
99103
}
@@ -105,7 +109,7 @@ public static int query(int jobl, int jobr, int l, int r, int i) {
105109
return 0;
106110
}
107111
if (jobl <= l && r <= jobr) {
108-
return max[i];
112+
return maxv[i];
109113
}
110114
down(i);
111115
int mid = (l + r) >> 1;
@@ -142,7 +146,7 @@ public static void main(String[] args) throws Exception {
142146
addEdge(fa, i);
143147
}
144148
dp(1);
145-
out.println(max[root[1]]);
149+
out.println(maxv[root[1]]);
146150
out.flush();
147151
out.close();
148152
}
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
package class182;
2+
3+
// 领导集团问题,C++版
4+
// 一共有n个节点,给定每个点的点权,所有节点组成一棵树
5+
// 已知1号节点是整棵树的头,其他节点的父亲节点都会给出
6+
// 如果你在树上选择了u、v两个节点,并且u是v的祖先节点的话
7+
// 那么需要保证 u的点权 <= v的点权,除此之外就没有别的限制了
8+
// 打印你最多能在树上选择几个点
9+
// 1 <= n <= 2 * 10^5
10+
// 0 <= 点权 <= 10^9
11+
// 测试链接 : https://www.luogu.com.cn/problem/P4577
12+
// 如下实现是C++的版本,C++版本和java版本逻辑完全一样
13+
// 提交如下代码,可以通过所有测试用例
14+
15+
//#include <bits/stdc++.h>
16+
//
17+
//using namespace std;
18+
//
19+
//const int MAXN = 200001;
20+
//const int MAXV = 1000000000;
21+
//const int MAXT = MAXN * 40;
22+
//int n;
23+
//int arr[MAXN];
24+
//
25+
//int head[MAXN];
26+
//int nxt[MAXN];
27+
//int to[MAXN];
28+
//int cntg;
29+
//
30+
//int root[MAXN];
31+
//int ls[MAXT];
32+
//int rs[MAXT];
33+
//int maxv[MAXT];
34+
//int addTag[MAXT];
35+
//int cntt;
36+
//
37+
//void addEdge(int u, int v) {
38+
// nxt[++cntg] = head[u];
39+
// to[cntg] = v;
40+
// head[u] = cntg;
41+
//}
42+
//
43+
//void up(int i) {
44+
// maxv[i] = max(maxv[ls[i]], maxv[rs[i]]);
45+
//}
46+
//
47+
//void lazy(int i, int v) {
48+
// if (i != 0) {
49+
// maxv[i] += v;
50+
// addTag[i] += v;
51+
// }
52+
//}
53+
//
54+
//void down(int i) {
55+
// if (addTag[i] > 0) {
56+
// lazy(ls[i], addTag[i]);
57+
// lazy(rs[i], addTag[i]);
58+
// addTag[i] = 0;
59+
// }
60+
//}
61+
//
62+
//int add(int jobi, int jobv, int l, int r, int i) {
63+
// int rt = i;
64+
// if (rt == 0) {
65+
// rt = ++cntt;
66+
// }
67+
// if (l == r) {
68+
// maxv[rt] = max(maxv[rt], jobv);
69+
// } else {
70+
// down(rt);
71+
// int mid = (l + r) >> 1;
72+
// if (jobi <= mid) {
73+
// ls[rt] = add(jobi, jobv, l, mid, ls[rt]);
74+
// } else {
75+
// rs[rt] = add(jobi, jobv, mid + 1, r, rs[rt]);
76+
// }
77+
// up(rt);
78+
// }
79+
// return rt;
80+
//}
81+
//
82+
//int merge(int l, int r, int t1, int t2, int max1, int max2) {
83+
// if (t1 == 0 || t2 == 0) {
84+
// if (t1 != 0) {
85+
// lazy(t1, max2);
86+
// }
87+
// if (t2 != 0) {
88+
// lazy(t2, max1);
89+
// }
90+
// return t1 + t2;
91+
// }
92+
// if (l == r) {
93+
// maxv[t1] = max(maxv[t1], max1) + max(maxv[t2], max2);
94+
// } else {
95+
// down(t1);
96+
// down(t2);
97+
// int mid = (l + r) >> 1;
98+
// ls[t1] = merge(l, mid, ls[t1], ls[t2], max(max1, maxv[rs[t1]]), max(max2, maxv[rs[t2]]));
99+
// rs[t1] = merge(mid + 1, r, rs[t1], rs[t2], max1, max2);
100+
// up(t1);
101+
// }
102+
// return t1;
103+
//}
104+
//
105+
//int query(int jobl, int jobr, int l, int r, int i) {
106+
// if (i == 0) {
107+
// return 0;
108+
// }
109+
// if (jobl <= l && r <= jobr) {
110+
// return maxv[i];
111+
// }
112+
// down(i);
113+
// int mid = (l + r) >> 1;
114+
// int ans = 0;
115+
// if (jobl <= mid) {
116+
// ans = max(ans, query(jobl, jobr, l, mid, ls[i]));
117+
// }
118+
// if (jobr > mid) {
119+
// ans = max(ans, query(jobl, jobr, mid + 1, r, rs[i]));
120+
// }
121+
// return ans;
122+
//}
123+
//
124+
//void dp(int u) {
125+
// int val = 1;
126+
// for (int e = head[u]; e; e = nxt[e]) {
127+
// int v = to[e];
128+
// dp(v);
129+
// val += query(arr[u], MAXV, 1, MAXV, root[v]);
130+
// root[u] = merge(1, MAXV, root[u], root[v], 0, 0);
131+
// }
132+
// root[u] = add(arr[u], val, 1, MAXV, root[u]);
133+
//}
134+
//
135+
//int main() {
136+
// ios::sync_with_stdio(false);
137+
// cin.tie(nullptr);
138+
// cin >> n;
139+
// for (int i = 1; i <= n; i++) {
140+
// cin >> arr[i];
141+
// }
142+
// for (int i = 2, fa; i <= n; i++) {
143+
// cin >> fa;
144+
// addEdge(fa, i);
145+
// }
146+
// dp(1);
147+
// cout << maxv[root[1]] << '\n';
148+
// return 0;
149+
//}

src/class182/Code02_Minimax2.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,12 @@
5959
//}
6060
//
6161
//void up(int i) {
62-
// sum[i] = (sum[ls[i]] + sum[rs[i]]) % MOD;
62+
// sum[i] = (sum[ls[i]] + sum[rs[i]]) % MOD;
6363
//}
6464
//
6565
//void lazy(int i, long long v) {
6666
// if (i) {
67-
// sum[i] = sum[i] * v % MOD;
67+
// sum[i] = sum[i] * v % MOD;
6868
// mul[i] = mul[i] * v % MOD;
6969
// }
7070
//}
@@ -84,7 +84,7 @@
8484
// mul[rt] = 1;
8585
// }
8686
// if (l == r) {
87-
// sum[rt] = 1;
87+
// sum[rt] = 1;
8888
// } else {
8989
// down(rt);
9090
// int mid = (l + r) >> 1;

0 commit comments

Comments
 (0)