@@ -12,24 +12,43 @@ public class Solution {
12
12
private int [] s ;
13
13
14
14
public long maxScore (int n , int [][] edges ) {
15
+ initializeArrays (n );
16
+ processEdges (edges );
17
+ List <Integer > circles = new ArrayList <>();
18
+ List <Integer > chains = new ArrayList <>();
19
+ findParentsAndUpdateCircles ();
20
+ collectCirclesAndChains (circles , chains );
21
+ Collections .sort (circles );
22
+ chains .sort ((a , b ) -> Integer .compare (b , a ));
23
+ return calculateScore (n , circles , chains );
24
+ }
25
+
26
+ private void initializeArrays (int n ) {
15
27
p = new int [n ];
16
28
c = new boolean [n ];
17
29
s = new int [n ];
18
30
for (int i = 0 ; i < n ; i ++) {
19
31
p [i ] = i ;
20
32
s [i ] = 1 ;
21
33
}
34
+ }
35
+
36
+ private void processEdges (int [][] edges ) {
22
37
for (int [] ele : edges ) {
23
38
join (ele [0 ], ele [1 ]);
24
39
}
25
- List <Integer > circles = new ArrayList <>();
26
- List <Integer > chains = new ArrayList <>();
40
+ }
41
+
42
+ private void findParentsAndUpdateCircles () {
27
43
for (int i = 0 ; i < p .length ; i ++) {
28
44
p [i ] = findParent (i );
29
45
if (c [i ]) {
30
46
c [p [i ]] = true ;
31
47
}
32
48
}
49
+ }
50
+
51
+ private void collectCirclesAndChains (List <Integer > circles , List <Integer > chains ) {
33
52
for (int i = 0 ; i < p .length ; i ++) {
34
53
if (p [i ] == i ) {
35
54
int size = s [i ];
@@ -40,58 +59,75 @@ public long maxScore(int n, int[][] edges) {
40
59
}
41
60
}
42
61
}
43
- Collections .sort (circles );
44
- chains .sort ((a , b ) -> Integer .compare (b , a ));
62
+ }
63
+
64
+ private long calculateScore (int n , List <Integer > circles , List <Integer > chains ) {
45
65
long ret = 0 ;
46
66
int start = n ;
67
+ ret += processCircles (circles , start );
68
+ start = n - getTotalCircleSize (circles );
69
+ ret += processChains (chains , start );
70
+ return ret ;
71
+ }
72
+
73
+ private int getTotalCircleSize (List <Integer > circles ) {
74
+ return circles .stream ().mapToInt (Integer ::intValue ).sum ();
75
+ }
76
+
77
+ private long processCircles (List <Integer > circles , int start ) {
78
+ long ret = 0 ;
47
79
for (int size : circles ) {
48
80
if (size == 1 ) {
49
81
continue ;
50
82
}
51
- int [] temp = new int [size ];
52
- int ptr1 = 0 ;
53
- int ptr2 = size - 1 ;
54
- int curStart = start - size + 1 ;
55
- for (int i = 0 ; i < size ; i ++) {
56
- if (i % 2 == 0 ) {
57
- temp [ptr1 ++] = curStart + i ;
58
- } else {
59
- temp [ptr2 --] = curStart + i ;
60
- }
61
- }
62
- long pro = 0 ;
63
- for (int i = 1 ; i < size ; i ++) {
64
- pro += (long ) temp [i ] * temp [i - 1 ];
65
- }
66
- pro += (long ) temp [0 ] * temp [size - 1 ];
83
+ int [] temp = createTempArray (size , start );
84
+ long pro = calculateProduct (temp , true );
67
85
ret += pro ;
68
86
start = start - size ;
69
87
}
88
+ return ret ;
89
+ }
90
+
91
+ private long processChains (List <Integer > chains , int start ) {
92
+ long ret = 0 ;
70
93
for (int size : chains ) {
71
94
if (size == 1 ) {
72
95
continue ;
73
96
}
74
- int [] temp = new int [size ];
75
- int ptr1 = 0 ;
76
- int ptr2 = size - 1 ;
77
- int curStart = start - size + 1 ;
78
- for (int i = 0 ; i < size ; i ++) {
79
- if (i % 2 == 0 ) {
80
- temp [ptr1 ++] = curStart + i ;
81
- } else {
82
- temp [ptr2 --] = curStart + i ;
83
- }
84
- }
85
- long pro = 0 ;
86
- for (int i = 1 ; i < size ; i ++) {
87
- pro += (long ) temp [i ] * temp [i - 1 ];
88
- }
97
+ int [] temp = createTempArray (size , start );
98
+ long pro = calculateProduct (temp , false );
89
99
ret += pro ;
90
100
start = start - size ;
91
101
}
92
102
return ret ;
93
103
}
94
104
105
+ private int [] createTempArray (int size , int start ) {
106
+ int [] temp = new int [size ];
107
+ int ptr1 = 0 ;
108
+ int ptr2 = size - 1 ;
109
+ int curStart = start - size + 1 ;
110
+ for (int i = 0 ; i < size ; i ++) {
111
+ if (i % 2 == 0 ) {
112
+ temp [ptr1 ++] = curStart + i ;
113
+ } else {
114
+ temp [ptr2 --] = curStart + i ;
115
+ }
116
+ }
117
+ return temp ;
118
+ }
119
+
120
+ private long calculateProduct (int [] temp , boolean isCircle ) {
121
+ long pro = 0 ;
122
+ for (int i = 1 ; i < temp .length ; i ++) {
123
+ pro += (long ) temp [i ] * temp [i - 1 ];
124
+ }
125
+ if (isCircle ) {
126
+ pro += (long ) temp [0 ] * temp [temp .length - 1 ];
127
+ }
128
+ return pro ;
129
+ }
130
+
95
131
private int findParent (int x ) {
96
132
if (p [x ] != x ) {
97
133
p [x ] = findParent (p [x ]);
0 commit comments