#include<cstdio>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
using namespace std;
const int MAX_N = 1000001;
struct Node {
long long speed;
long long start;
bool done;
};
Node t[MAX_N];
int n;
bool cmp(const Node &i, const Node &j) {
if(i.speed < j.speed) return true;
if(i.start < j.start && i.speed == j.speed) return true;
return false;
}
void solve() {
long long res = 0;
long long all_speed = 0;
sort(t, t+n, cmp);
//for(int i = 0; i < n; i++) printf("%lld %lld\n", t[i].speed, t[i].start);
for(int i = 0; i < n; i++) {
int maxi = -1;
long long max = 0;
int count = 0;
long long speed = 0;
for(int j = 0; j < n; j++) {
if(t[j].done) {count++; speed += t[j].speed; continue;}
long long diff = count * t[j].speed + t[j].start + (all_speed - speed);
if(diff > max || (diff ==max && (maxi==-1 || t[j].speed >= t[maxi].speed))) {
maxi = j;
max = diff;
}
}
t[maxi].done = true;
res += max;
all_speed += t[maxi].speed;
printf("%lld\n", res);
}
}
int main(int args, char* argv[]) {
scanf("%d", &n);
for(int i = 0; i < n; i++) {
long long a, b;
scanf("%lld%lld", &a, &b);
t[i].speed = a;
t[i].start = b;
}
solve();
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 | #include<cstdio> #include<algorithm> #include<string> #include<vector> #include<set> using namespace std; const int MAX_N = 1000001; struct Node { long long speed; long long start; bool done; }; Node t[MAX_N]; int n; bool cmp(const Node &i, const Node &j) { if(i.speed < j.speed) return true; if(i.start < j.start && i.speed == j.speed) return true; return false; } void solve() { long long res = 0; long long all_speed = 0; sort(t, t+n, cmp); //for(int i = 0; i < n; i++) printf("%lld %lld\n", t[i].speed, t[i].start); for(int i = 0; i < n; i++) { int maxi = -1; long long max = 0; int count = 0; long long speed = 0; for(int j = 0; j < n; j++) { if(t[j].done) {count++; speed += t[j].speed; continue;} long long diff = count * t[j].speed + t[j].start + (all_speed - speed); if(diff > max || (diff ==max && (maxi==-1 || t[j].speed >= t[maxi].speed))) { maxi = j; max = diff; } } t[maxi].done = true; res += max; all_speed += t[maxi].speed; printf("%lld\n", res); } } int main(int args, char* argv[]) { scanf("%d", &n); for(int i = 0; i < n; i++) { long long a, b; scanf("%lld%lld", &a, &b); t[i].speed = a; t[i].start = b; } solve(); return 0; } |
English