結果
問題 | No.2382 Amidakuji M |
ユーザー |
|
提出日時 | 2023-07-14 22:51:07 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 237 ms / 2,000 ms |
コード長 | 2,786 bytes |
コンパイル時間 | 229 ms |
コンパイル使用メモリ | 82,176 KB |
実行使用メモリ | 110,336 KB |
最終ジャッジ日時 | 2024-09-16 07:56:12 |
合計ジャッジ時間 | 3,661 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 19 |
ソースコード
import syssys.setrecursionlimit(5*10**5)input = sys.stdin.readlinefrom collections import defaultdict, deque, Counterfrom heapq import heappop, heappushfrom bisect import bisect_left, bisect_rightfrom math import gcddef add(x, y):return x + ydef e(a):if a == min:return 10**18if a == max:return -10**18if a == add:return 0class SegTree:def __init__(self, segf, init_val):n = len(init_val)self.segf = segfself.e = e(segf)self.seg_len = 1 << n.bit_length()self.seg = [self.e] * 2*self.seg_lenfor i in range(n):self.seg[i + self.seg_len] = init_val[i]for i in range(self.seg_len)[::-1]:self.seg[i] = segf(self.seg[i << 1], self.seg[i << 1 | 1])def point_add(self, pos, x):pos += self.seg_lenself.seg[pos] += xwhile True:pos >>= 1if not pos:breakself.seg[pos] = self.segf(self.seg[pos << 1], self.seg[pos << 1 | 1])def point_update(self, pos, x):pos += self.seg_lenself.seg[pos] = xwhile True:pos >>= 1if not pos:breakself.seg[pos] = self.segf(self.seg[pos << 1], self.seg[pos << 1 | 1])def get_range(self, l, r):l += self.seg_lenr += self.seg_lenres = self.ewhile l < r:if l & 1:res = self.segf(res, self.seg[l])l += 1if r & 1:r -= 1res = self.segf(res, self.seg[r])l >>= 1r >>= 1return res# ------ range_add & get_point -------def range_add(self, l, r, x):l += self.seg_lenr += self.seg_lenself.seg[l] += xself.seg[r] += xwhile l < r:if l & 1:self.seg[l] = self.segf(x, self.seg[l])l += 1if r & 1:r -= 1self.seg[r] = self.segf(x, self.seg[r])l >>= 1r >>= 1def get_point(self, pos):pos += self.seg_lenres = self.seg[pos]while True:pos >>= 1if not pos:breakres = self.segf(res, self.seg[pos])return resn,m = map(int,input().split())p = list(map(int,input().split()))st = SegTree(add,[0]*(n+10))ans = 0for i in range(n):ans += st.get_range(p[i],n+5)st.point_add(p[i],1)if ans == 0:print(0)elif m % 2 == 0 and ans % 2 == 1:print(-1)else:mn = m *( (ans+m-1)//m)if (mn - ans) % 2 == 0:print(mn)else:print(mn + m)