結果

問題 No.2382 Amidakuji M
ユーザー flygonflygon
提出日時 2023-07-14 22:49:01
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 2,784 bytes
コンパイル時間 350 ms
コンパイル使用メモリ 86,820 KB
実行使用メモリ 112,576 KB
最終ジャッジ日時 2023-10-14 13:06:08
合計ジャッジ時間 5,687 ms
ジャッジサーバーID
(参考情報)
judge11 / judge14
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 93 ms
71,500 KB
testcase_01 AC 93 ms
71,392 KB
testcase_02 AC 90 ms
71,372 KB
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 AC 90 ms
71,380 KB
testcase_14 AC 89 ms
71,380 KB
testcase_15 AC 90 ms
71,340 KB
testcase_16 WA -
testcase_17 AC 91 ms
71,336 KB
testcase_18 WA -
testcase_19 WA -
testcase_20 AC 280 ms
112,576 KB
testcase_21 AC 275 ms
112,236 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
sys.setrecursionlimit(5*10**5)
input = sys.stdin.readline
from collections import defaultdict, deque, Counter
from heapq import heappop, heappush
from bisect import bisect_left, bisect_right
from math import gcd
def add(x, y):
    return x + y


def e(a):
    if a == min:
        return 10**18
    if a == max:
        return -10**18
    if a == add:
        return 0


class SegTree:
    def __init__(self, segf, init_val):
        n = len(init_val)
        self.segf = segf
        self.e = e(segf)
        self.seg_len = 1 << n.bit_length()
        self.seg = [self.e] * 2*self.seg_len

        for 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_len
        self.seg[pos] += x
        while True:
            pos >>= 1
            if not pos:
                break
            self.seg[pos] = self.segf(
                self.seg[pos << 1],  self.seg[pos << 1 | 1])

    def point_update(self, pos, x):
        pos += self.seg_len
        self.seg[pos] = x
        while True:
            pos >>= 1
            if not pos:
                break
            self.seg[pos] = self.segf(
                self.seg[pos << 1],  self.seg[pos << 1 | 1])

    def get_range(self, l, r):
        l += self.seg_len
        r += self.seg_len
        res = self.e
        while l < r:
            if l & 1:
                res = self.segf(res, self.seg[l])
                l += 1
            if r & 1:
                r -= 1
                res = self.segf(res, self.seg[r])
            l >>= 1
            r >>= 1
        return res

    # ------ range_add & get_point -------
    def range_add(self, l, r, x):
        l += self.seg_len
        r += self.seg_len
        self.seg[l] += x
        self.seg[r] += x
        while l < r:
            if l & 1:
                self.seg[l] = self.segf(x, self.seg[l])
                l += 1
            if r & 1:
                r -= 1
                self.seg[r] = self.segf(x, self.seg[r])
            l >>= 1
            r >>= 1

    def get_point(self, pos):
        pos += self.seg_len
        res = self.seg[pos]
        while True:
            pos >>= 1
            if not pos:
                break
            res = self.segf(res, self.seg[pos])
        return res

n,m = map(int,input().split())
p = list(map(int,input().split()))
st = SegTree(add,[0]*(n+10))
ans = 0
for 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)
0