結果

問題 No.2501 Maximum Inversion Number
ユーザー flygonflygon
提出日時 2023-10-13 23:42:35
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 2,212 bytes
コンパイル時間 309 ms
コンパイル使用メモリ 82,304 KB
実行使用メモリ 116,272 KB
最終ジャッジ日時 2024-09-15 19:35:08
合計ジャッジ時間 5,214 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 49 ms
54,784 KB
testcase_01 WA -
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 AC 282 ms
115,968 KB
testcase_09 AC 106 ms
91,776 KB
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 AC 478 ms
87,936 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 sol():
    n,m = map(int,input().split())
    l = list(map(int,input().split()))
    r = list(map(int,input().split()))
    if sum(l) > m or sum(r) < m:
        print(-1)
        return
    cnt = defaultdict(int)
    left = m
    for i in range(n):
        cnt[l[i]] += 1
        left -= l[i]
    r.sort()
    r = r[::-1]
    all = []
    for k, v in cnt.items():
        all.append([k,v])
    nn = len(all)
    all.sort()
    all.append([10**10,0])
    ans = []
    for i in range(nn):
        now = all[i][0]
        cnt = all[i][1]
        while r and r[-1] == now:
            r.pop()
            cnt -= 1
            ans.append([now, 1])
        nxt = all[i+1][0]
        while r and r[-1] < nxt:
            num = r.pop()
            dif = num - now
            if cnt == 0: continue 
            if left > dif * cnt:
                left -= dif*cnt
                cnt -= 1
                now = num
                ans.append([now, 1])
            else:
                add = left//cnt
                rr = left % cnt
                ans.append([now+add+1,rr])
                ans.append([now+add,cnt-rr])
                left = 0
                cnt = 0
        dif = nxt - now
        if cnt:
            if left > dif * cnt:
                left -= dif*cnt
            else:
                add = left//cnt
                rr = left % cnt
                ans.append([now+add+1,rr])
                ans.append([now+add,cnt-rr])
                left = 0
                if now + add + 1 == nxt:
                    cnt = rr
                    ans.append([now+add,cnt-rr])
                elif now + add + 1 == nxt:
                    cnt -= rr
                else:
                    cnt = 0
                    ans.append([now+add+1,rr])
                    ans.append([now+add,cnt-rr])
        all[i+1][1] += cnt

    ansnum = m*(m-1)//2
    for i,j in ans:
        ansnum -= j*(i*(i-1)//2)
    print(ansnum)
    return 


T = int(input())
for i in range(T):
    sol()
0