結果
| 問題 | No.568 じゃんじゃん 落とす 委員会 | 
| コンテスト | |
| ユーザー |  lam6er | 
| 提出日時 | 2025-04-16 15:43:57 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                TLE
                                 
                             | 
| 実行時間 | - | 
| コード長 | 2,994 bytes | 
| コンパイル時間 | 1,352 ms | 
| コンパイル使用メモリ | 82,088 KB | 
| 実行使用メモリ | 158,196 KB | 
| 最終ジャッジ日時 | 2025-04-16 15:46:58 | 
| 合計ジャッジ時間 | 5,054 ms | 
| ジャッジサーバーID (参考情報) | judge2 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | TLE * 1 -- * 25 | 
ソースコード
import bisect
def main():
    import sys
    input = sys.stdin.read().split()
    idx = 0
    n = int(input[idx])
    m = int(input[idx+1])
    idx +=2
    participants = []
    for _ in range(n):
        xi = int(input[idx])
        ai = int(input[idx+1])
        bi = int(input[idx+2])
        participants.append( (xi, ai, bi) )
        idx +=3
    # Preprocess all distinct Ai values, sorted in decreasing order
    ai_values = set()
    for xi, ai, bi in participants:
        ai_values.add(ai)
    ai_values.add(0)
    ai_values.add(100001)
    sorted_ai = sorted(ai_values, reverse=True)
    min_sum3 = float('inf')
    for SA in sorted_ai:
        group1_count = 0
        group2_count = 0
        group3_A_ok_1 = []
        group3_A_ok_0 = []
        group4_A_ok_1 = []
        group2_A_ok_1 = []
        group2_A_ok_0 = []
        for p in participants:
            xi, ai, bi = p
            if xi >=3:
                group1_count +=1
            elif xi ==2:
                group2_count +=1
                if ai >= SA:
                    group2_A_ok_1.append(bi)
                else:
                    group2_A_ok_0.append(bi)
            elif xi ==1:
                if ai >= SA:
                    group3_A_ok_1.append(bi)
                else:
                    group3_A_ok_0.append(bi)
            else: # xi ==0
                if ai >= SA:
                    group4_A_ok_1.append(bi)
        m_prime = m - (group1_count + group2_count)
        if m_prime <0:
            m_prime =0
        # Compute group3_A_ok_1_count (number of group3_A_ok_1 participants)
        group3_A_ok_1_count = len(group3_A_ok_1)
        # Compute group3_A_ok_0 and group4_A_ok_1 merged Bi
        merged_bi = group3_A_ok_0.copy()
        merged_bi.extend(group4_A_ok_1)
        merged_bi.sort()
        required = m_prime - group3_A_ok_1_count
        if required <=0:
            # SB can be as large as possible
            sum3 = group1_count + len(group2_A_ok_1)
            if sum3 < min_sum3:
                min_sum3 = sum3
            continue
        # Binary search for the largest SB where merged_bi has >= required elements >= SB
        low = 0
        high = 100001
        best_sb = 0
        while low <= high:
            mid = (low + high) //2
            cnt = len(merged_bi) - bisect.bisect_left(merged_bi, mid)
            if cnt >= required:
                best_sb = mid
                low = mid +1
            else:
                high = mid -1
        # Now compute sum3
        group2_A_ok_0_count = 0
        for bi in group2_A_ok_0:
            if bi >= best_sb:
                group2_A_ok_0_count +=1
        group3_A_ok_1_count = 0
        for bi in group3_A_ok_1:
            if bi >= best_sb:
                group3_A_ok_1_count +=1
        sum3 = group1_count + len(group2_A_ok_1) + group2_A_ok_0_count + group3_A_ok_1_count
        if sum3 < min_sum3:
            min_sum3 = sum3
    print(min_sum3)
if __name__ == '__main__':
    main()
            
            
            
        