@@ -12,24 +12,43 @@ public class Solution {
1212 private int [] s ;
1313
1414 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 ) {
1527 p = new int [n ];
1628 c = new boolean [n ];
1729 s = new int [n ];
1830 for (int i = 0 ; i < n ; i ++) {
1931 p [i ] = i ;
2032 s [i ] = 1 ;
2133 }
34+ }
35+
36+ private void processEdges (int [][] edges ) {
2237 for (int [] ele : edges ) {
2338 join (ele [0 ], ele [1 ]);
2439 }
25- List <Integer > circles = new ArrayList <>();
26- List <Integer > chains = new ArrayList <>();
40+ }
41+
42+ private void findParentsAndUpdateCircles () {
2743 for (int i = 0 ; i < p .length ; i ++) {
2844 p [i ] = findParent (i );
2945 if (c [i ]) {
3046 c [p [i ]] = true ;
3147 }
3248 }
49+ }
50+
51+ private void collectCirclesAndChains (List <Integer > circles , List <Integer > chains ) {
3352 for (int i = 0 ; i < p .length ; i ++) {
3453 if (p [i ] == i ) {
3554 int size = s [i ];
@@ -40,58 +59,75 @@ public long maxScore(int n, int[][] edges) {
4059 }
4160 }
4261 }
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 ) {
4565 long ret = 0 ;
4666 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 ;
4779 for (int size : circles ) {
4880 if (size == 1 ) {
4981 continue ;
5082 }
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 );
6785 ret += pro ;
6886 start = start - size ;
6987 }
88+ return ret ;
89+ }
90+
91+ private long processChains (List <Integer > chains , int start ) {
92+ long ret = 0 ;
7093 for (int size : chains ) {
7194 if (size == 1 ) {
7295 continue ;
7396 }
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 );
8999 ret += pro ;
90100 start = start - size ;
91101 }
92102 return ret ;
93103 }
94104
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+
95131 private int findParent (int x ) {
96132 if (p [x ] != x ) {
97133 p [x ] = findParent (p [x ]);
0 commit comments