Вы можете просто для каждого дня сортировать элементы (вам нужно сначала выбрать самую низкую цену для каждого дня) и добавить элемент в приоритетную очередь как значение + налог (когда налог рассчитывается как 2 * j -1 , где j - это j-тый предмет, купленный в тот день. Это работает, потому что k ^ 2 - (k + 1) ^ 2. И каждый день вы убираете первый элемент (лучшая батарея, которую вы можете купить в настоящее время).
#include <iostream>
#include <utility>
#include <algorithm>
#include <queue>
#include <cmath>
#include <vector>
using namespace std;
int n, m;
vector <long long> pom;
int x;
priority_queue<long long> q;
long long score;
int main(){
cin.tie(0);
ios_base::sync_with_stdio(0);
cin >> n >> m;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cin >> x;
pom.push_back(x);
}
sort(pom.begin(), pom.end());
for(int j = 0; j < pom.size(); j++){
pom[j] += 1 + 2 * j;
q.push(-pom[j]);
}
pom.clear();
score += q.top();
q.pop();
}
cout << -score;
}
Сложность для этого решения O (n * m logm)