1+ class Helper :
2+ def __init__ (self , x ):
3+ self .x = x
4+ self .result = 0
5+ self .large = SortedList ()
6+ self .small = SortedList ()
7+ self .occ = defaultdict (int )
8+
9+ def insert (self , num ):
10+ if self .occ [num ] > 0 :
11+ self .internal_remove ((self .occ [num ], num ))
12+ self .occ [num ] += 1
13+ self .internal_insert ((self .occ [num ], num ))
14+
15+ def remove (self , num ):
16+ self .internal_remove ((self .occ [num ], num ))
17+ self .occ [num ] -= 1
18+ if self .occ [num ] > 0 :
19+ self .internal_insert ((self .occ [num ], num ))
20+
21+ def get (self ):
22+ return self .result
23+
24+ def internal_insert (self , p ):
25+ if len (self .large ) < self .x or p > self .large [0 ]:
26+ self .result += p [0 ] * p [1 ]
27+ self .large .add (p )
28+ if len (self .large ) > self .x :
29+ to_remove = self .large [0 ]
30+ self .result -= to_remove [0 ] * to_remove [1 ]
31+ self .large .remove (to_remove )
32+ self .small .add (to_remove )
33+ else :
34+ self .small .add (p )
35+
36+ def internal_remove (self , p ):
37+ if p >= self .large [0 ]:
38+ self .result -= p [0 ] * p [1 ]
39+ self .large .remove (p )
40+ if self .small :
41+ to_add = self .small [- 1 ]
42+ self .result += to_add [0 ] * to_add [1 ]
43+ self .small .remove (to_add )
44+ self .large .add (to_add )
45+ else :
46+ self .small .remove (p )
47+
48+
49+ class Solution :
50+ def findXSum (self , nums , k , x ):
51+ helper = Helper (x )
52+ ans = []
53+
54+ for i in range (len (nums )):
55+ helper .insert (nums [i ])
56+ if i >= k :
57+ helper .remove (nums [i - k ])
58+ if i >= k - 1 :
59+ ans .append (helper .get ())
60+
61+ return ans
0 commit comments