#include <iostream>
#include <string>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
struct bucket {
uint64_t beg;
uint64_t inc;
};
bool compinc (const bucket & lhs, const bucket & rhs){
if(lhs.inc == rhs.inc){
lhs.beg < rhs.beg;
}
return lhs.inc < rhs.inc;
}
std::vector <bucket> ordinc;
uint64_t count (const vector<bucket> &what, int i){
uint64_t ret = 0;
for(auto j = 0ull; j < i; j ++){
ret += what[j].beg + what[j].inc * j;
}
return ret;
}
int main(){
int N;
cin >> N;
for(int a = 0; a < N; a++){
bucket cur;
cin >> cur.inc;
cin >> cur.beg;
ordinc.push_back(cur);
}
sort(ordinc.begin(), ordinc.end(), compinc);
uint64_t totleft = count(ordinc, ordinc.size());
vector<uint64_t> ans;
ans.push_back(totleft);
for(int d = 1; d < N; d++){
uint64_t sofar = 0;
uint64_t min = ordinc[ordinc.size() - 1].beg + ordinc[ordinc.size() - 1].inc * (ordinc.size() - 1);
int todel = ordinc.size() - 1;
for(int i = ordinc.size() - 1; i >= 0; i--){
auto a = ordinc[i].beg + ordinc[i].inc * i + sofar;
if (min > a){
todel = i;
min = a;
}
sofar += ordinc[i].inc;
}
ordinc.erase(ordinc.begin() + todel, ordinc.begin() + todel + 1);
totleft = totleft - min;
ans.push_back(totleft);
}
for(auto a = ans.rbegin(); a != ans.rend(); a ++){
std::cout << *a << std::endl;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include <iostream> #include <string> #include <algorithm> #include <map> #include <vector> using namespace std; struct bucket { uint64_t beg; uint64_t inc; }; bool compinc (const bucket & lhs, const bucket & rhs){ if(lhs.inc == rhs.inc){ lhs.beg < rhs.beg; } return lhs.inc < rhs.inc; } std::vector <bucket> ordinc; uint64_t count (const vector<bucket> &what, int i){ uint64_t ret = 0; for(auto j = 0ull; j < i; j ++){ ret += what[j].beg + what[j].inc * j; } return ret; } int main(){ int N; cin >> N; for(int a = 0; a < N; a++){ bucket cur; cin >> cur.inc; cin >> cur.beg; ordinc.push_back(cur); } sort(ordinc.begin(), ordinc.end(), compinc); uint64_t totleft = count(ordinc, ordinc.size()); vector<uint64_t> ans; ans.push_back(totleft); for(int d = 1; d < N; d++){ uint64_t sofar = 0; uint64_t min = ordinc[ordinc.size() - 1].beg + ordinc[ordinc.size() - 1].inc * (ordinc.size() - 1); int todel = ordinc.size() - 1; for(int i = ordinc.size() - 1; i >= 0; i--){ auto a = ordinc[i].beg + ordinc[i].inc * i + sofar; if (min > a){ todel = i; min = a; } sofar += ordinc[i].inc; } ordinc.erase(ordinc.begin() + todel, ordinc.begin() + todel + 1); totleft = totleft - min; ans.push_back(totleft); } for(auto a = ans.rbegin(); a != ans.rend(); a ++){ std::cout << *a << std::endl; } } |
English