import collections

def calculate_osu_replay(objects, clicks):
    # 將物件放入 Queue 方便操作
    obj_queue = collections.deque(objects)
    
    # 初始化統計數據
    stats = {
        "count_300": 0,
        "count_100": 0,
        "count_50": 0,
        "count_miss": 0,
        "max_combo": 0
    }
    
    current_combo = 0
    total_objects = len(objects)
    
    # 處理玩家的每一次點擊
    for click in clicks:
        if not obj_queue:
            break # 譜面已經沒有物件了，忽略後續所有點擊
            
        # 1. 檢查在這次點擊之前，是否有物件已經「過期 Miss」了
        # (即該物件的最晚判定時間 < 這次點擊的時間)
        while obj_queue and obj_queue[0] + 100 < click:
            obj_queue.popleft()
            stats["count_miss"] += 1
            current_combo = 0 # 斷康
            
        if not obj_queue:
            break
            
        target_obj = obj_queue[0]
        dt = abs(click - target_obj)
        
        # 2. 判斷點擊是否落在判定區間內
        if dt <= 100:
            # 命中物件，從 queue 中移除
            obj_queue.popleft()
            current_combo += 1
            stats["max_combo"] = max(stats["max_combo"], current_combo)
            
            if dt <= 20:
                stats["count_300"] += 1
            elif dt <= 60:
                stats["count_100"] += 1
            else: # 60 < dt <= 100
                stats["count_50"] += 1
                
        # 3. 如果 dt > 100 (表示過早點擊)，不處理，保留物件等待下一次點擊
        
    # 迴圈結束後，如果 queue 裡面還有物件，代表玩家根本沒點，全部算 Miss
    while obj_queue:
        obj_queue.popleft()
        stats["count_miss"] += 1
        current_combo = 0
        
    # 計算準確度
    if total_objects == 0:
        accuracy = 0.0
    else:
        total_score = (stats["count_300"] * 300) + (stats["count_100"] * 100) + (stats["count_50"] * 50)
        max_possible_score = total_objects * 300
        accuracy = (total_score / max_possible_score) * 100
        
    stats["accuracy"] = round(accuracy, 2)
    
    return stats

# ==========================================
# 測試區塊
# ==========================================
if __name__ == "__main__":
    # 測資 1: 完美全接 (Perfect SS)
    print("Test 1: Perfect SS")
    objects1 = [1000, 2000, 3000]
    clicks1 = [1005, 1990, 3000]
    print(calculate_osu_replay(objects1, clicks1))
    
    # 測資 2: 包含空揮、Miss、斷Combo (範例測資)
    print("\nTest 2: Normal Play with Misses")
    objects2 = [1000, 1500, 2000, 2200, 3000]
    clicks2 = [500, 1015, 1450, 2150, 3090, 3150]
    print(calculate_osu_replay(objects2, clicks2))

    # 測資 3: 中途放棄遊戲 (後面物件全部放推)
    print("\nTest 3: Quit halfway")
    objects3 = [1000, 1500, 2000, 2500, 3000]
    clicks3 = [1000, 1500] 
    print(calculate_osu_replay(objects3, clicks3))