#include <bits/stdc++.h>
using namespace std;
map<int, long long> generateCostBreakpoints(
const vector<int>& stock,
const vector<int>& require,
const vector<int>& cost,
int n)
{
int m = stock.size();
map<int, long long> breakpoints;
breakpoints[0] = 0; // start at 0 products with 0 cost
// Priority queue for breakpoints when stock of item i runs out
struct Event {
int productCount;
long long extraCostPerProduct;
bool operator>(const Event& other) const {
return productCount > other.productCount;
}
};
priority_queue<Event, vector<Event>, greater<Event>> pq;
for (int i = 0; i < m; i++) {
if (require[i] == 0) continue;
int canCover = stock[i] / require[i];
if (canCover < n) {
long long extra = 1LL * require[i] * cost[i];
pq.push({canCover + 1, extra});
}
}
long long currCost = 0;
long long slope = 0; // cost per product
int lastProd = 0;
while (!pq.empty()) {
auto ev = pq.top(); pq.pop();
int prod = ev.productCount;
if (prod > n) break;
// Accumulate cost till this breakpoint
currCost += slope * (prod - lastProd);
breakpoints[prod] = currCost;
// Increase slope after this breakpoint
slope += ev.extraCostPerProduct;
lastProd = prod;
}
// Fill till n if needed
if (lastProd < n) {
currCost += slope * (n - lastProd);
breakpoints[n] = currCost;
}
return breakpoints;
}
int main() {
vector<int> stock = {10, 4};
vector<int> require = {2, 1};
vector<int> cost = {3, 5};
int n = 10;
auto bp = generateCostBreakpoints(stock, require, cost, n);
for (auto& [prod, c] : bp) {
cout << prod << " -> " << c << "\n";
}
return 0;
}