結果
| 問題 | 
                            No.3166 [Cherry 7th Tune *] 桜の守人
                             | 
                    
| コンテスト | |
| ユーザー | 
                            👑  Kazun
                         | 
                    
| 提出日時 | 2023-10-22 18:40:58 | 
| 言語 | PyPy3  (7.3.15)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 660 ms / 2,000 ms | 
| コード長 | 2,335 bytes | 
| コンパイル時間 | 226 ms | 
| コンパイル使用メモリ | 81,852 KB | 
| 実行使用メモリ | 156,576 KB | 
| 最終ジャッジ日時 | 2025-05-30 21:02:40 | 
| 合計ジャッジ時間 | 15,189 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 2 | 
| other | AC * 26 | 
ソースコード
def General_Binary_Increase_Search_Integer(L, R, cond, default=None):
    """ 条件式が単調増加であるとき, 整数上で二部探索を行う.
    L: 解の下限
    R: 解の上限
    cond: 条件(1変数関数, 広義単調増加を満たす)
    default: Lで条件を満たさないときの返り値
    """
    if not(cond(R)):
        return default
    if cond(L):
        return L
    R+=1
    while R-L>1:
        C=L+(R-L)//2
        if cond(C):
            R=C
        else:
            L=C
    return R
from collections import defaultdict
class Sparse_Imos_1:
    def __init__(self):
        self.dict=defaultdict(int)
    def add(self, l, r, x=1):
        """閉区間 [l,r] に x を加算する.
        """
        if l<=r:
            self.dict[l]+=x
            self.dict[r+1]-=x
    def cumulative_sum(self, since, until):
        """累積和を求める.
        [Output]
        (y, l, r) という形のリスト. ただし, (y, l, r) は l<=x<=y の範囲では y であるということを意味する.
        """
        Y=[]
        S=0
        t_old=since
        dic=self.dict
        for t in sorted(dic):
            if t>until:
                break
            if dic[t]==0:
                continue
            if t_old<=t-1:
                Y.append((S, t_old,t-1))
            S+=dic[t]
            t_old=t
        if t_old<=until:
            Y.append((S, t_old,until))
        return Y
#==================================================
def solve():
    N, L, K = map(int, input().split())
    X = list(map(int, input().split()))
    def check(P):
        if 2 * P > L:
            return True
        I = Sparse_Imos_1()
        for x in X:
            if x - P < 0:
                I.add(0, x + P - 1)
                I.add((x - P) + L, L - 1)
            elif L - 1 < x + P - 1:
                I.add(0, x + P - L - 1)
                I.add(x - P, L - 1)
            else:
                I.add(x - P, x + P - 1)
        J = I.cumulative_sum(0, L - 1)
        return min(y for y, _, _ in J) >= K
    return General_Binary_Increase_Search_Integer(0, (L + 1) // 2, check, -1)
#==================================================
import sys
input=sys.stdin.readline
write=sys.stdout.write
T = int(input())
write("\n".join(map(str, [solve() for _ in range(T)])))
            
            
            
        
            
Kazun