|
| 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