Submission
Status:
(-SSSSSSSSSSSSSS)(-SSSSSSS)(-SSSSSSSSS)(-SSSSSSSSS)(-SSSSSSSSS)(P-SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS)
Subtask/Task Score:
{0/3}{0/7}{0/12}{0/17}{0/21}{0/40}
Score: 0
User: mzmvtbgf
Problemset: รถไฟตู้เสบียง (Dining Car)
Language: cpp
Time: 0.001 second
Submitted On: 2026-04-24 16:15:22
#include <bits/stdc++.h>
#include "dining_car.h"
using namespace std;
// you can also write additional functions here
// int N, A, B;
// int calls_cnt;
// void quit(const char* message) {
// printf("%s\n", message);
// exit(0);
// }
// int calc_dist(int i){
// return std::min(std::abs(i-A),std::abs(i-B));
// }
// int compare_cars(int i, int j){
// calls_cnt++;
// cout << i << " " << j << " \n";
// if (calls_cnt > 60)
// quit("Too many calls");
// if (i<1 || i>N || j<1 || j>N)
// quit("Invalid argument");
// int dist_i = calc_dist(i);
// int dist_j = calc_dist(j);
// if(dist_i < dist_j)
// return -1;
// if(dist_i == dist_j)
// return 0;
// return 1;
// }
pair<int,int> locate_dining_cars(int N)
{
pair<int, int> ans = {0,0};
int left = 1;
int right = N;
int x = -1;
while (left < right)
{
int mid = left + (right-left)/2;
int aa = compare_cars(mid-1, mid + 1);
if (aa == -1)
{
right = mid - 1;
}
else if (aa == 0)
{
left = mid;
break;
}
else left = mid + 1;
}
ans.first = left;
x = left;
// cout << x << "\n";
if (compare_cars(x/2, x/2 + N/2) > -1)
{
left = 1;
right = x-1;
}
else
{
left = x + 1;
right = N;
}
// cout << left << " " << right << "\n";
while (left < right)
{
int mid = left + (right-left)/2;
int sec1 = left + (mid-left)/2;
int sec2 = mid + (right-mid)/2;
int aa = compare_cars(sec1, sec2);
if (sec2 - sec1 == 1)
{
if (aa == -1) ans.second = sec1;
else ans.second = sec2;
break;
}
if (aa == 0)
{
ans.second = sec1 + (sec2-sec1)/2;
break;
}
else if (aa == -1) right = mid + 1;
else left = mid + 1;
}
return ans;
}
// int main() {
// scanf("%d%d%d",&N, &A, &B);
// std::pair<int, int> P = locate_dining_cars(N);
// printf("%d %d %d\n", P.first, P.second, calls_cnt);
// return 0;
// }