@@ -24,13 +24,15 @@ public class Code01_PersistentUnionFind1 {
2424 public static int MAXT = 8000001 ;
2525 public static int n , m ;
2626
27+ // 可持久化线段树
2728 public static int [] rootfa = new int [MAXM ];
2829 public static int [] rootsiz = new int [MAXM ];
2930 public static int [] ls = new int [MAXT ];
3031 public static int [] rs = new int [MAXT ];
3132 public static int [] val = new int [MAXT ];
3233 public static int cnt = 0 ;
3334
35+ // 建立可持久化的father数组
3436 public static int buildfa (int l , int r ) {
3537 int rt = ++cnt ;
3638 if (l == r ) {
@@ -43,6 +45,7 @@ public static int buildfa(int l, int r) {
4345 return rt ;
4446 }
4547
48+ // 建立可持久化的siz数组
4649 public static int buildsiz (int l , int r ) {
4750 int rt = ++cnt ;
4851 if (l == r ) {
@@ -55,6 +58,7 @@ public static int buildsiz(int l, int r) {
5558 return rt ;
5659 }
5760
61+ // 来自讲解157,题目1,修改数组中一个位置的值,生成新版本的树
5862 public static int update (int jobi , int jobv , int l , int r , int i ) {
5963 int rt = ++cnt ;
6064 ls [rt ] = ls [i ];
@@ -72,6 +76,7 @@ public static int update(int jobi, int jobv, int l, int r, int i) {
7276 return rt ;
7377 }
7478
79+ // 来自讲解157,题目1,查询数组中一个位置的值
7580 public static int query (int jobi , int l , int r , int i ) {
7681 if (l == r ) {
7782 return val [i ];
@@ -84,6 +89,7 @@ public static int query(int jobi, int l, int r, int i) {
8489 }
8590 }
8691
92+ // 基于v版本,查询x的集合头节点,不做扁平化
8793 public static int find (int x , int v ) {
8894 int fa = query (x , 1 , n , rootfa [v ]);
8995 while (x != fa ) {
@@ -93,6 +99,7 @@ public static int find(int x, int v) {
9399 return x ;
94100 }
95101
102+ // 基于v版本,合并x所在的集合和y所在的集合,生成新版本的树
96103 public static void union (int x , int y , int v ) {
97104 int fx = find (x , v );
98105 int fy = find (y , v );
0 commit comments