#include<cstdio>
#include<deque>
#include<algorithm>
std::deque<std::pair<long long, long long> > d;
std::deque<std::pair<long long, long long> >:: iterator it,akt;
std::pair<long long, long long>g[1000002], pom;
int n, num=0;
long long sum,a,b, maks=0, il=0,wynik=0;
int main()
{
scanf("%d", &n);
for(int i=0; i<n; i++)
{
scanf("%lld%lld", &b, &a);
g[i].first=b; g[i].second=a;
}
std::sort(g, g+n);
for(int i=0; i<n; i++)
{
if(g[i].second>maks)
{
maks=g[i].second;
il=g[i].first;
num=i;
}
else if(g[i].second==maks&&g[i].first>il)
{
il=g[i].first;
num=i;
}
}
pom.first=g[num].first;
pom.second=g[num].second;
sum=il;
g[num].first=0;
g[num].second=0;
d.push_back(pom);
pom.first=(long long)10000000000000;
d.push_back(pom);
printf("%lld\n", maks);
for(int i=1; i<n; i++)
{
il=0;
it=d.begin();
maks+=sum;
wynik=maks;
for(int j=0; j<n; j++)
{
while((*it).first<g[j].first)
{
wynik-=(*it).first; il++; it++;
}
if(wynik+g[j].second+g[j].first*il>maks)
{
num=j;
maks=wynik+g[j].second+g[j].first*il;
akt=it;
}
}
sum+=g[num].first;
pom.first=g[num].first;
pom.second=g[num].second;
d.insert(akt, pom);
g[num].first=0;
g[num].second=0;
printf("%lld\n", maks);
}
return 0;
}
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 | #include<cstdio> #include<deque> #include<algorithm> std::deque<std::pair<long long, long long> > d; std::deque<std::pair<long long, long long> >:: iterator it,akt; std::pair<long long, long long>g[1000002], pom; int n, num=0; long long sum,a,b, maks=0, il=0,wynik=0; int main() { scanf("%d", &n); for(int i=0; i<n; i++) { scanf("%lld%lld", &b, &a); g[i].first=b; g[i].second=a; } std::sort(g, g+n); for(int i=0; i<n; i++) { if(g[i].second>maks) { maks=g[i].second; il=g[i].first; num=i; } else if(g[i].second==maks&&g[i].first>il) { il=g[i].first; num=i; } } pom.first=g[num].first; pom.second=g[num].second; sum=il; g[num].first=0; g[num].second=0; d.push_back(pom); pom.first=(long long)10000000000000; d.push_back(pom); printf("%lld\n", maks); for(int i=1; i<n; i++) { il=0; it=d.begin(); maks+=sum; wynik=maks; for(int j=0; j<n; j++) { while((*it).first<g[j].first) { wynik-=(*it).first; il++; it++; } if(wynik+g[j].second+g[j].first*il>maks) { num=j; maks=wynik+g[j].second+g[j].first*il; akt=it; } } sum+=g[num].first; pom.first=g[num].first; pom.second=g[num].second; d.insert(akt, pom); g[num].first=0; g[num].second=0; printf("%lld\n", maks); } return 0; } |
English