// REIGN2 // Reign 2 // // Author: Kanstantsin Sokal // Complexity: O(N ^ 2) per testcase // // Expected verdict: AC #include #include using namespace std; const int MAX_N = 5005; const long long INF = (long long)1e18; int n; pair castles[MAX_N]; long long dp[MAX_N][MAX_N]; bool castles_comparator(const pair &a, const pair &b) { return a.second > b.second; } void update(long long &to, long long from) { to = max(from, to); } void solve_one_case() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &castles[i].first); } for (int i = 1; i <= n; i++) { scanf("%d", &castles[i].second); } sort(castles + 1, castles + n + 1, castles_comparator); for (int i = 0; i <= n; i++) { for (int j = 0; j <= n; j++) { dp[i][j] = -INF; } } dp[0][0] = 0; for (int i = 0; i < n; i++) { for (int j = 0; j <= i; j++) { if (dp[i][j] == -INF) { continue; } update(dp[i + 1][j], dp[i][j]); update(dp[i + 1][j + 1], dp[i][j] + castles[i + 1].second * 1ll * j + castles[i + 1].first); } } for (int i = 1; i <= n; i++) { printf("%lld ", dp[n][i]); } printf("\n"); } int main() { int cases; scanf("%d", &cases); for (int i = 0; i < cases; i++) { solve_one_case(); } }