#include using namespace std; typedef long long LL; const long long LINF = (long long) 1e18; const int INF = (int) 1e6; const int MAX_SIZE = (int) 1e5 + 10; long long A[MAX_SIZE], B[MAX_SIZE], temp[MAX_SIZE]; int N, K; /** * Time complexity : O(N^3 * K^2) */ long long solveFirstSubtask() { long long ans = -LINF; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (i == j) { // increase value for (int inc = 0; inc <= K; inc++) { for (int k = 0; k < N; k++) { temp[k] = A[k]; } temp[i] += inc; long long res = 0; for (int k = 0; k < N; k++) { res += temp[k] * B[k]; } ans = max(ans, res); } // decrease value for (int dec = 0; dec <= K; dec++) { for (int k = 0; k < N; k++) { temp[k] = A[k]; } temp[i] -= dec; long long res = 0; for (int k = 0; k < N; k++) { res += temp[k] * B[k]; } ans = max(ans, res); } } else { for (int inc = 0; inc <= K; inc++) { for (int dec = 0; dec <= K - inc; dec++) { // increase i by k // and decrease j by K - k for (int k = 0; k < N; k++) { temp[k] = A[k]; } temp[i] += inc; temp[j] -= dec; long long res = 0; for (int k = 0; k < N; k++) { res += temp[k] * B[k]; } ans = max(ans, res); } } } } } return ans; } /** * O(N * N) */ long long solveSecondSubtask() { long long ans = -LINF; for (int i = 0; i < N; i++) { { // inc i by K long long temp = 0; for (int j = 0; j < N; j++) { temp += A[j] * B[j]; if (j == i) { temp += B[j] * K; } } ans = max(ans, temp); } { // dec i by K long long temp = 0; for (int j = 0; j < N; j++) { temp += A[j] * B[j]; if (j == i) { temp -= B[j] * K; } } ans = max(ans, temp); } } return ans; } /** * O(N log N) */ long long solveThirdSubtask() { long long sum = 0; for (int i = 0; i < N; i++) { sum += A[i] * B[i]; } //cout << "sum " << sum << endl; sort(B, B + N); long long val = max(abs(B[0]), abs(B[N - 1])); long long ans = sum + val * K; return ans; } int MAXN, MAXK, MAXA, MAXT; int subtaskToSolve = 1; long long solveSubask() { switch (subtaskToSolve) { case 1 : return solveFirstSubtask(); case 2 : return solveSecondSubtask(); case 3 : return solveThirdSubtask(); } } void readInput() { switch (subtaskToSolve) { case 1: MAXN = MAXK = MAXA = 10; break; case 2: MAXN = MAXK = MAXA = 1000; MAXK = (int) 1e5; break; case 3: MAXN = MAXA = 100000; MAXK = (int) 1e9; break; } scanf("%d %d", &N, &K); assert(N >= 1 && N <= MAXN); assert(K >= 0 && K <= MAXK); for (int i = 0; i < N; i++) { scanf("%lld", &A[i]); assert(A[i] >= -MAXA && A[i] <= MAXA); } for (int i = 0; i < N; i++) { scanf("%lld", &B[i]); assert(B[i] >= -MAXA && B[i] <= MAXA); } } void generateRandomInput() { subtaskToSolve = 2; switch (subtaskToSolve) { case 1: MAXN = MAXK = MAXA = 10; break; case 2: MAXN = MAXK = 1000; MAXA = (int) 1e5; break; case 3: MAXN = MAXA = 100000; MAXK = (int) 1e9; break; } N = rand() % MAXN + 1; K = rand() % MAXK; for (int i = 0; i < N; i++) { int temp = rand() % MAXA; if (rand() % 2 == 0) { temp *= -1; } A[i] = temp; } for (int i = 0; i < N; i++) { int temp = rand() % MAXA; if (rand() % 2 == 0) { temp *= -1; } B[i] = temp; } } void print() { cout << N << " " << K << endl; for (int i = 0; i < N; i++) { cout << A[i] << " "; } cout << endl; for (int i = 0; i < N; i++) { cout << B[i] << " "; } cout << endl; } int main() { int T = 100000; scanf("%d", &T); assert(T >= 1 && T <= 10); int tc = 0; while (T--) { subtaskToSolve = 3; readInput(); //generateRandomInput(); //cout << endl; //print(); /* subtaskToSolve = 1; long long ans = solveSubask(); print(); */ //subtaskToSolve = 2; //long long bans = solveSubask(); //print(); long long ans = solveSubask(); cout << ans << endl; //print(); /* cout << endl << "test case " << tc++ << endl; cout << bans << " " << bbans << endl; assert(bans == bbans); */ } return 0; }