Skip to content

Commit 256f5ee

Browse files
authored
Create 3321. Find X-Sum of All K-Long Subarrays II (#927)
2 parents edb3382 + 62fde32 commit 256f5ee

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
class Solution {
2+
public:
3+
using P = pair<int,int>;
4+
struct Cmp {
5+
bool operator()(const P& a, const P& b) const {
6+
if (a.first != b.first) return a.first > b.first;
7+
return a.second > b.second;
8+
}
9+
};
10+
11+
vector<long long> findXSum(vector<int>& nums, int k, int x) {
12+
int n = (int)nums.size();
13+
vector<long long> ans(n - k + 1);
14+
15+
unordered_map<int,int> cnt;
16+
cnt.reserve(n * 1);
17+
18+
set<P, Cmp> top, rest;
19+
long long topSum = 0;
20+
21+
auto pull = [&](int v, int f){
22+
P key{f, v};
23+
auto it = top.find(key);
24+
if (it != top.end()){
25+
topSum -= 1LL * v * f;
26+
top.erase(it);
27+
} else {
28+
auto jt = rest.find(key);
29+
if (jt != rest.end()) rest.erase(jt);
30+
}
31+
};
32+
auto pushToTop = [&](int v, int f){
33+
top.insert({f, v});
34+
topSum += 1LL * v * f;
35+
};
36+
37+
auto insertVal = [&](int v){
38+
int f = cnt[v];
39+
if (f) pull(v, f);
40+
++f; cnt[v] = f;
41+
pushToTop(v, f);
42+
if ((int)top.size() > x){
43+
auto it = prev(top.end());
44+
topSum -= 1LL * it->first * it->second;
45+
rest.insert(*it);
46+
top.erase(it);
47+
}
48+
};
49+
50+
auto eraseVal = [&](int v){
51+
auto itc = cnt.find(v);
52+
if (itc == cnt.end()) return;
53+
int f = itc->second;
54+
pull(v, f);
55+
if (--f == 0){
56+
cnt.erase(itc);
57+
} else {
58+
cnt[v] = f;
59+
rest.insert({f, v});
60+
}
61+
if ((int)top.size() < x && !rest.empty()){
62+
auto best = rest.begin();
63+
topSum += 1LL * best->first * best->second;
64+
top.insert(*best);
65+
rest.erase(best);
66+
}
67+
};
68+
69+
for (int i = 0; i < k; ++i) insertVal(nums[i]);
70+
ans[0] = topSum;
71+
for (int i = k; i < n; ++i){
72+
eraseVal(nums[i-k]);
73+
insertVal(nums[i]);
74+
ans[i - k + 1] = topSum;
75+
}
76+
return ans;
77+
}
78+
};

0 commit comments

Comments
 (0)