#include <bits/stdc++.h> #define int long long #define mp(a, b) make_pair(a, b) #define nd second #define st first using namespace std; //multiset<pair<int, int> > pozostale;// pary[1000007]; //multiset<pair<int, int> > dp; vector<pair<int, int>> dp; vector<pair<int, int>> pozostale;// tbl[1000008]; int pref[1000009]; #undef int int main() { #define int long long ios_base::sync_with_stdio(0); cin.tie(0); int n, a, b; cin>>n; for (int i=0; i<n; i++) { cin>>a>>b; pozostale.push_back(mp(a, b)); } sort(pozostale.begin(), pozostale.end()); for (int i=0; i<n; i++) { pref[dp.size()]=0; for (int j=((int)dp.size())-1; j>=0; j--) { pref[j]=dp[j].st+pref[j+1]; } int maks=0, maxpoz=0, co=0, wynik=0; int q=0; for (int j=0; j<pozostale.size(); j++) { //int q=upper_bound(dp.begin(), dp.end(), pozostale[j])-dp.begin(); while(q<dp.size()) if (dp[q].st<=pozostale[j].st) q++; else break; if (maks<pref[q]+pozostale[j].nd+pozostale[j].st*q) { maks=pref[q]+pozostale[j].nd+pozostale[j].st*q; maxpoz=q; co=j; } } dp.insert(dp.begin()+maxpoz, pozostale[co]); pozostale.erase(pozostale.begin()+co); for (int j=0; j<dp.size(); j++) { wynik+=dp[j].st*j+dp[j].nd; } cout<<wynik<<"\n"; } return 0; } /*int maks=0, maks1=0; int q=0; for (int i=0; i<pozostale.size(); i++) { if (maks<pozostale[i].nd) { maks=pozostale[i].nd; maks1=pozostale[i].st; q=i; } else if(maks==pozostale[i].nd && maks1<pozostale[i].st) { maks=pozostale[i].nd; maks1=pozostale[i].st; q=i; } } auto pom=pozostale[q]; //auto kuc=q; pom.nd-=pom.st*i; dp.insert(pom); pozostale.erase(pozostale.begin()+q); int num=0, wynik=0; for (auto it=dp.begin(); it!=dp.end(); it++) { wynik+=(*it).nd+(*it).st*num; num++; } cout<<wynik<<"\n"; for (int i=0; i<pozostale.size(); i++) { pozostale[i].nd+=pozostale[i].st; } /*for (int i=0; i<n2; i++) { tbl[i].nd+=tbl[i].st; } /*for (auto it=pozostale.begin(); it!=pozostale.end();) { pom=*it; kuc=it; it++; pozostale.erase(kuc); pozostale.insert(mp(pom.st, pom.st+pom.nd)); } for (auto it : dp) { cout<<it.st<<" "<<it.nd<<", "; } cout<<"\n"; for (auto it : pozostale) { cout<<it.st<<" "<<it.nd<<", "; } cout<<"\n"; //*/
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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | #include <bits/stdc++.h> #define int long long #define mp(a, b) make_pair(a, b) #define nd second #define st first using namespace std; //multiset<pair<int, int> > pozostale;// pary[1000007]; //multiset<pair<int, int> > dp; vector<pair<int, int>> dp; vector<pair<int, int>> pozostale;// tbl[1000008]; int pref[1000009]; #undef int int main() { #define int long long ios_base::sync_with_stdio(0); cin.tie(0); int n, a, b; cin>>n; for (int i=0; i<n; i++) { cin>>a>>b; pozostale.push_back(mp(a, b)); } sort(pozostale.begin(), pozostale.end()); for (int i=0; i<n; i++) { pref[dp.size()]=0; for (int j=((int)dp.size())-1; j>=0; j--) { pref[j]=dp[j].st+pref[j+1]; } int maks=0, maxpoz=0, co=0, wynik=0; int q=0; for (int j=0; j<pozostale.size(); j++) { //int q=upper_bound(dp.begin(), dp.end(), pozostale[j])-dp.begin(); while(q<dp.size()) if (dp[q].st<=pozostale[j].st) q++; else break; if (maks<pref[q]+pozostale[j].nd+pozostale[j].st*q) { maks=pref[q]+pozostale[j].nd+pozostale[j].st*q; maxpoz=q; co=j; } } dp.insert(dp.begin()+maxpoz, pozostale[co]); pozostale.erase(pozostale.begin()+co); for (int j=0; j<dp.size(); j++) { wynik+=dp[j].st*j+dp[j].nd; } cout<<wynik<<"\n"; } return 0; } /*int maks=0, maks1=0; int q=0; for (int i=0; i<pozostale.size(); i++) { if (maks<pozostale[i].nd) { maks=pozostale[i].nd; maks1=pozostale[i].st; q=i; } else if(maks==pozostale[i].nd && maks1<pozostale[i].st) { maks=pozostale[i].nd; maks1=pozostale[i].st; q=i; } } auto pom=pozostale[q]; //auto kuc=q; pom.nd-=pom.st*i; dp.insert(pom); pozostale.erase(pozostale.begin()+q); int num=0, wynik=0; for (auto it=dp.begin(); it!=dp.end(); it++) { wynik+=(*it).nd+(*it).st*num; num++; } cout<<wynik<<"\n"; for (int i=0; i<pozostale.size(); i++) { pozostale[i].nd+=pozostale[i].st; } /*for (int i=0; i<n2; i++) { tbl[i].nd+=tbl[i].st; } /*for (auto it=pozostale.begin(); it!=pozostale.end();) { pom=*it; kuc=it; it++; pozostale.erase(kuc); pozostale.insert(mp(pom.st, pom.st+pom.nd)); } for (auto it : dp) { cout<<it.st<<" "<<it.nd<<", "; } cout<<"\n"; for (auto it : pozostale) { cout<<it.st<<" "<<it.nd<<", "; } cout<<"\n"; //*/ |