結果

問題 No.2078 魔抜けなパープル
ユーザー taiga0629kyoprotaiga0629kyopro
提出日時 2022-09-08 00:42:35
言語 PyPy3
(7.3.13)
結果
AC  
実行時間 124 ms / 2,000 ms
コード長 2,055 bytes
コンパイル時間 356 ms
コンパイル使用メモリ 87,184 KB
実行使用メモリ 77,828 KB
最終ジャッジ日時 2023-08-16 23:36:10
合計ジャッジ時間 2,558 ms
ジャッジサーバーID
(参考情報)
judge11 / judge12
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 118 ms
72,924 KB
testcase_01 AC 124 ms
77,732 KB
testcase_02 AC 123 ms
77,344 KB
testcase_03 AC 121 ms
77,704 KB
testcase_04 AC 122 ms
77,828 KB
testcase_05 AC 120 ms
77,696 KB
testcase_06 AC 124 ms
77,812 KB
testcase_07 AC 120 ms
77,452 KB
権限があれば一括ダウンロードができます

ソースコード

diff #




#########################################
from collections import deque
class Convex_Hull_Trick():

    #https://tjkendev.github.io/procon-library/python/convex_hull_trick/deque.html
    #追加する傾きが単調減少かつqueryのxが単調増加
    #単調性なしが良いならこちらへ(queryのxは先読み) https://judge.yosupo.jp/submission/30579

    def __init__(self):
        self.deq=deque()
    def check(self,f1, f2, f3):
        return (f2[0] - f1[0]) * (f3[1] - f2[1]) >= (f2[1] - f1[1]) * (f3[0] - f2[0])
    def f(self,f1, x):
        return f1[0] * x + f1[1]

    # add f_i(x) = a*x + b
    def add_line(self,a, b):
        f1 = (a, b)
        while len(self.deq) >= 2 and self.check(self.deq[-2], self.deq[-1], f1):
            self.deq.pop()
        self.deq.append(f1)

    # min f_i(x)
    def query(self,x):
        while len(self.deq) >= 2 and self.f(self.deq[0], x) >= self.f(self.deq[1], x):
            self.deq.popleft()
        return self.f(self.deq[0], x)

##################################







def sol1(X,A):
    #O(A)
    ans = 2 ** 63
    for k in range(1, A + 1):
        cnt1 = k - A % k
        cnt2 = A % k
        res = cnt1 * ((A // k)**2) + cnt2 * ((A // k + 1)**2) + X * k
        ans = min(ans, res)
    return ans

def sol2(X,A):
    #O(A)
    dp=[2**63]*(A+1)
    dp[0]=0
    cht=Convex_Hull_Trick()
    cht.add_line(0,0)
    for i in range(1,A+1):
        dp[i]=cht.query(i)+i**2+X
        cht.add_line(-2*i,dp[i]+i**2)
    return dp[A]

def sol3(X,A):
    #O(√A)
    R=A
    ans=2**63
    while R:
        q=A//R
        L=A//(q+1)+1
        def f(k):
            return k*(q**2)+(A-q*k)*(2*q+1)+X*k
        ans=min(ans,f(L),f(R))
        R=L-1
    return ans


T=int(input())
for iii in range(T):
    X,A=map(int,input().split())
    print(sol3(X,A))


from random import randrange as rd
cnt=0

while 0:
    cnt+=1
    print(cnt)
    X=rd(100)
    A=rd(1,10**4)
    ans1=sol1(X,A)
    ans2=sol2(X,A)
    ans3=sol3(X,A)
    if not(ans1==ans2==ans3):
        print(X,A)
        exit()



0