Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.BufferedReader;
- import java.io.FileReader;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.Objects;
- import java.util.stream.Collectors;
- public enum Main {;
- static final class Pair<F, S> {
- F first;
- S second;
- public Pair(final F first, final S second) {
- this.first = first;
- this.second = second;
- }
- @Override
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (o == null || this.getClass() != o.getClass()) return false;
- final Pair<?, ?> pair = (Pair<?, ?>) o;
- return this.first.equals(pair.first) && this.second.equals(pair.second);
- }
- @Override
- public int hashCode() {
- return Objects.hash(this.first, this.second);
- }
- @Override
- public String toString() {
- return "Pair{" +
- "first=" + first +
- ", second=" + second +
- '}';
- }
- }
- public static final void main(final String[] args) throws IOException {
- try (final var reader = new BufferedReader(new FileReader("kek.txt"))) {
- final var nums = reader
- .lines()
- .skip(1L)
- .map(Integer::parseInt)
- .map(x -> x * 3)
- .collect(Collectors.toList());
- final var totalSums = new long[nums.size()];
- final var leftAndRightSums = new ArrayList<Pair<Long, Long>>(nums.size());
- for (int i = 0; i < nums.size(); i++)
- leftAndRightSums.add(new Pair<>(0L, 0L));
- final int mid = nums.size() / 2;
- for (int i = 0; i < mid; i++)
- leftAndRightSums.get(0).second += nums.get(i);
- for (int i = mid; i < nums.size(); i++)
- leftAndRightSums.get(0).first += nums.get(i);
- for (int i = 0; i < mid; i++)
- totalSums[0] += (long) nums.get(i) * (long) i;
- for (int i = mid, mul = mid; i < nums.size(); i++, mul--)
- totalSums[0] += (long) nums.get(i) * (long) mul;
- for (int i = 1; i < mid; i++) {
- final var dif = (long) (nums.get(i - 1) - nums.get((i + mid - 1) % nums.size()));
- leftAndRightSums.get(i).second = leftAndRightSums.get(i - 1).second - dif;
- leftAndRightSums.get(i).first = leftAndRightSums.get(i - 1).first + dif;
- }
- for (int i = mid; i < nums.size(); i++) {
- leftAndRightSums.get(i).first = leftAndRightSums.get(i - mid).second;
- leftAndRightSums.get(i).second = leftAndRightSums.get(i - mid).first;
- }
- var minSum = totalSums[0];
- for (int i = 1; i < nums.size(); i++) {
- totalSums[i] = totalSums[i - 1] + leftAndRightSums.get(i).first - leftAndRightSums.get(i).second;
- minSum = Math.min(minSum, totalSums[i]);
- }
- System.out.println(minSum);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement