#include <iostream>
#include <vector>
#include <unordered_map>
#include <queue>
using namespace std;
vector<int> distributeElements(vector<int>& nums, int d) {
int n = nums.size();
unordered_map<int, int> mp;
priority_queue<pair<int, int>> pq; // {frequency, element}
// Count frequency of each element
for (int i = 0; i < n; ++i) {
mp[nums[i]]++;
}
// Push elements into max heap based on frequency
for (auto& it : mp) {
pq.push({it.second, it.first});
}
int windowSz = d + 1;
vector<int> ans(n);
// Fill the first 'd' elements with highest frequency elements
for (int i = 0; i < d && !pq.empty(); ++i) {
int eleFreq = pq.top().first;
int ele = pq.top().second;
pq.pop();
ans[i] = ele;
eleFreq--;
mp[ele]--;
if (mp[ele] == 0) {
mp.erase(ele);
} else {
pq.push({eleFreq, ele}); // push back with updated frequency
}
}
// Fill the rest of the array
for (int i = d; i < n; ++i) {
ans[i] = ans[i - windowSz];
mp[ans[i]]--;
if (mp[ans[i]] == 0) {
mp.erase(ans[i]);
}
}
// if(mp.size() > 0) return vector<int> ();
return ans;
}
int main() {
vector<int> nums = {1, 1, 2, 2, 3, 3, 4, 5}; // Example input
int d = 2;
vector<int> result = distributeElements(nums, d);
// if(result.size() == 0) {
// cout << -1 << endl;
// return 0;
// }
for (int val : result) {
cout << val << " ";
}
cout << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KI2luY2x1ZGUgPHF1ZXVlPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdmVjdG9yPGludD4gZGlzdHJpYnV0ZUVsZW1lbnRzKHZlY3RvcjxpbnQ+JiBudW1zLCBpbnQgZCkgewogICAgaW50IG4gPSBudW1zLnNpemUoKTsKCiAgICB1bm9yZGVyZWRfbWFwPGludCwgaW50PiBtcDsKICAgIHByaW9yaXR5X3F1ZXVlPHBhaXI8aW50LCBpbnQ+PiBwcTsgLy8ge2ZyZXF1ZW5jeSwgZWxlbWVudH0KCiAgICAvLyBDb3VudCBmcmVxdWVuY3kgb2YgZWFjaCBlbGVtZW50CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIG1wW251bXNbaV1dKys7CiAgICB9CgogICAgLy8gUHVzaCBlbGVtZW50cyBpbnRvIG1heCBoZWFwIGJhc2VkIG9uIGZyZXF1ZW5jeQogICAgZm9yIChhdXRvJiBpdCA6IG1wKSB7CiAgICAgICAgcHEucHVzaCh7aXQuc2Vjb25kLCBpdC5maXJzdH0pOwogICAgfQoKICAgIGludCB3aW5kb3dTeiA9IGQgKyAxOwogICAgdmVjdG9yPGludD4gYW5zKG4pOwoKICAgIC8vIEZpbGwgdGhlIGZpcnN0ICdkJyBlbGVtZW50cyB3aXRoIGhpZ2hlc3QgZnJlcXVlbmN5IGVsZW1lbnRzCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGQgJiYgIXBxLmVtcHR5KCk7ICsraSkgewogICAgICAgIGludCBlbGVGcmVxID0gcHEudG9wKCkuZmlyc3Q7CiAgICAgICAgaW50IGVsZSA9IHBxLnRvcCgpLnNlY29uZDsKICAgICAgICBwcS5wb3AoKTsKCiAgICAgICAgYW5zW2ldID0gZWxlOwogICAgICAgIGVsZUZyZXEtLTsKICAgICAgICBtcFtlbGVdLS07CgogICAgICAgIGlmIChtcFtlbGVdID09IDApIHsKICAgICAgICAgICAgbXAuZXJhc2UoZWxlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcS5wdXNoKHtlbGVGcmVxLCBlbGV9KTsgLy8gcHVzaCBiYWNrIHdpdGggdXBkYXRlZCBmcmVxdWVuY3kKICAgICAgICB9CiAgICB9CgogICAgLy8gRmlsbCB0aGUgcmVzdCBvZiB0aGUgYXJyYXkKICAgIGZvciAoaW50IGkgPSBkOyBpIDwgbjsgKytpKSB7CiAgICAgICAgYW5zW2ldID0gYW5zW2kgLSB3aW5kb3dTel07CiAgICAgICAgbXBbYW5zW2ldXS0tOwoKICAgICAgICBpZiAobXBbYW5zW2ldXSA9PSAwKSB7CiAgICAgICAgICAgIG1wLmVyYXNlKGFuc1tpXSk7CiAgICAgICAgfQogICAgfQoJCgkvLyBpZihtcC5zaXplKCkgPiAwKSByZXR1cm4gdmVjdG9yPGludD4gKCk7CgkKICAgIHJldHVybiBhbnM7Cn0KCmludCBtYWluKCkgewogICAgdmVjdG9yPGludD4gbnVtcyA9IHsxLCAxLCAyLCAyLCAzLCAzLCA0LCA1fTsgLy8gRXhhbXBsZSBpbnB1dAogICAgaW50IGQgPSAyOwoKICAgIHZlY3RvcjxpbnQ+IHJlc3VsdCA9IGRpc3RyaWJ1dGVFbGVtZW50cyhudW1zLCBkKTsKICAgIAoJLy8gaWYocmVzdWx0LnNpemUoKSA9PSAwKSB7CgkvLyAJY291dCA8PCAtMSA8PCBlbmRsOwoJLy8gCXJldHVybiAwOwoJLy8gfQoJCiAgICBmb3IgKGludCB2YWwgOiByZXN1bHQpIHsKICAgICAgICBjb3V0IDw8IHZhbCA8PCAiICI7CiAgICB9CiAgICBjb3V0IDw8IGVuZGw7CgogICAgcmV0dXJuIDA7Cn0K