2
public long maximumBeauty(int[] flowers, long newFlowers, int target, int full, int partial) {3
int n = flowers.length;4
long[] prefix = new long[n + 1];6
for (int i = 0; i < n; ++i) prefix[i + 1] = prefix[i] + Math.min(flowers[i], target);8
for (int c = 0, i = n - 1; c <= n; ++c) {9
long remain = prefix[n] - prefix[n - c] + newFlowers - c * (long) target, min = 0;10
if (0 > remain) break;11
i = Math.min(i, n - c - 1);13
&& (target <= flowers[i] || flowers[i] * (long) (i + 1) - prefix[i + 1] > remain)) i--;15
long dif = flowers[i] * (long) (i + 1) - prefix[i + 1];16
min = Math.min(target - 1, flowers[i] + (remain - dif) / (i + 1));17
if (i + 1 < n - c) min = Math.min(min, flowers[i + 1]);19
res = Math.max(res, c * (long) full + min * (long) partial);