|
| 1 | +from collections import deque, Counter |
| 2 | +n, m = map(int, input().split()) |
| 3 | +x = list(map(int, input().split())) |
| 4 | + |
| 5 | +# xと(x+1)mod nを繋いでいるので経路は時計回りか反時計回り |
| 6 | +# 最初に適当に最短になるように移動させて、最も通行回数が少ない辺を削除する |
| 7 | +# 通行回数が少ない辺が複数ある場合は全部試す?(未証明だが一旦1箇所で試す) |
| 8 | + |
| 9 | +# 累積和の差分を格納 |
| 10 | +counter = [0] * (2 * (n + 1)) |
| 11 | +q = deque(x) |
| 12 | + |
| 13 | +current_num = q.popleft() |
| 14 | +cost = 0 |
| 15 | +while q: |
| 16 | + next_num = q.popleft() |
| 17 | + max_num = max(current_num, next_num) |
| 18 | + min_num = min(current_num, next_num) |
| 19 | + # 時計回り |
| 20 | + diff1 = max_num - min_num |
| 21 | + # 反時計回り |
| 22 | + diff2 = (n + min_num) - max_num |
| 23 | + if diff1 < diff2: |
| 24 | + counter[min_num] += diff2 - diff1 |
| 25 | + counter[max_num] -= diff2 - diff1 |
| 26 | + elif diff1 > diff2: |
| 27 | + counter[max_num] += diff1 - diff2 |
| 28 | + counter[min_num + n] -= diff1 - diff2 |
| 29 | + |
| 30 | + cost += min(diff1, diff2) |
| 31 | + # print(cost, current_num, next_num, diff1, diff2) |
| 32 | + current_num = next_num |
| 33 | +# print(counter) |
| 34 | +# 累積和 |
| 35 | +losses = [0] * (2 * (n + 1)) |
| 36 | +for i in range(1, 2 * (n + 1)): |
| 37 | + losses[i] += losses[i - 1] + counter[i] |
| 38 | + |
| 39 | +for i in range(1, n + 1): |
| 40 | + losses[i] = losses[i] + losses[n + i] |
| 41 | +print(cost + min(losses[1:n + 1])) |
0 commit comments