Submission

Status:

(PPPPPPPPPPPPPPP)(PPPPPPPP)(PPPPPPPPPP)(PPPPPPPPPP)(PPPPPPPPPP)(%%%%P%P%PPPP%P%%%PP%%%%%%%%%%%%P%PP%P%%P)

Subtask/Task Score:

{3/3}{7/7}{12/12}{17/17}{21/21}{1/40}

Score: 61

User: Xapitize

Problemset: รถไฟตู้เสบียง (Dining Car)

Language: cpp

Time: 0.002 second

Submitted On: 2026-03-20 21:54:01

#include <bits/stdc++.h>
#include "dining_car.h"

using namespace std;

// ฟังก์ชันช่วยสำหรับทำ Binary Search หาจุดต่ำสุด (Local Minimum)
int find_min(int L, int R) {
    while (L < R) {
        int mid = L + (R - L) / 2;
        // ถ้า mid ไกลกว่า mid + 1 แสดงว่ากราฟกำลังดิ่งลงทางขวา
        if (compare_cars(mid, mid + 1) == 1) {
            L = mid + 1;
        } else {
            // กราฟเชิดขึ้นทางซ้าย หรือเป็นจุดสมมาตรพอดี
            R = mid;
        }
    }
    return L;
}

pair<int, int> locate_dining_cars(int N) {
    // 1. หาตู้เสบียงมาให้ได้ก่อน 1 ตู้ (จะเจอ A หรือ B ขึ้นอยู่กับจังหวะของ mid)
    int X = find_min(1, N);
    
    // 2. ลองค้นหาในโซนฝั่งซ้ายของ X ก่อน (ถ้ามีพื้นที่ให้หา)
    if (X > 1) {
        int Y = find_min(1, X - 1);
        
        // พิสูจน์ว่า Y เป็นตู้เสบียงจริงๆ หรือไม่
        // (X คือตู้เสบียงแน่นอน ถ้าระยะห่างเท่ากับ X แสดงว่า Y ก็เป็นตู้เสบียง)
        if (compare_cars(Y, X) == 0) {
            return make_pair(Y, X); // เจอครบแล้ว A=Y, B=X
        }
    }
    
    // 3. ถ้าฝั่งซ้ายไม่ใช่ตู้เสบียง แสดงว่าอีกตู้ต้องซ่อนอยู่ฝั่งขวาแน่นอน
    int Z = find_min(X + 1, N);
    return make_pair(X, Z); // เจอครบแล้ว A=X, B=Z
}