Submission

Status:

(P-SSSSSSSSSSSSS)(-SSSSSSS)(-SSSSSSSSS)(PPPPPPP-SS)(PPPPPPPPPP)(PPPPPPPPPPPPPPP-SSSSSSSSSSSSSSSSSSSSSSSS)

Subtask/Task Score:

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

Score: 21

User: Nagornz

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

Language: cpp

Time: 0.001 second

Submitted On: 2025-05-24 19:40:22

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

using namespace std;

int ask(int x, int y){
    return compare_cars(x, y);
}

int solve(int l, int r) {
    while (l < r) {
        int mid = (l + r) / 2;
        int x = ask(mid, mid + 1);
        if (x == -1) r = mid;
        else l = mid + 1;
    }
    return l;
}

pair <int32_t, int32_t> locate_dining_cars(int32_t n) {
    if (n == 2) return {1, 2};
    int l = 1, r = n;
    while (l < r) {
        int midd = (l + r) / 2;
        int x = ask(l, r);
        if (x == 0) {
            int a = solve(l, midd);
            int dist = midd - a;
            int b = midd + dist;
            return {min(a, b), max(a, b)};
        }
        int y = ask(midd, midd + 1);
        if (x == -1) {
            if (y == -1) r = midd;
            else { 
                int ll = midd + 1, rr = r, a, b;
                while (ll < rr) {
                    int mid = (ll + rr) / 2;
                    if (ask(mid, mid + 1) == -1) rr = mid;
                    else ll = mid + 1;
                }
                b = ll;
                ll = l, rr = 2 * midd - b;
                while (ll < rr) {
                    int mid = (ll + rr) / 2;
                    if (ask(mid, mid + 1) == -1) rr = mid;
                    else ll = mid + 1;
                }
                a = ll;
                return {min(a, b), max(a, b)};
            }
        } 
        else {
            if (y == 0) {
                int a = solve(l, midd);
                int b = 2 * midd - a;
                return {min(a, b), max(a, b)};
            } 
            else if (y == -1) {
                int ll = l, rr = midd, a, b;
                while (ll < rr) {
                    int mid = (ll + rr) / 2;
                    if (ask(mid, mid + 1) == -1) rr = mid;
                    else ll = mid + 1;
                }
                a = ll;
                ll = 2 * midd - a, rr = r;
                while (ll < rr) {
                    int mid = (ll + rr) / 2;
                    if (ask(mid, mid + 1) == -1) rr = mid;
                    else ll = mid + 1;
                }
                b = ll;
                return {min(a, b), max(a, b)};
            } 
            else l = midd + 1;
        }
    }
    return {l, r};
}