Submission #70727491


Source Code Expand

Copy
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BIT_MAX 512345
int bit_table[BIT_MAX];
void bit_add(int pos, int value) {
pos++;
while (pos <= BIT_MAX) {
bit_table[pos - 1] += value;
pos += pos & (-pos);
}
}
int bit_sum(int pos) {
int sum = 0;
pos++;
while (pos > 0) {
sum += bit_table[pos - 1];
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BIT_MAX 512345

int bit_table[BIT_MAX];

void bit_add(int pos, int value) {
	pos++;
	while (pos <= BIT_MAX) {
		bit_table[pos - 1] += value;
		pos += pos & (-pos);
	}
}

int bit_sum(int pos) {
	int sum = 0;
	pos++;
	while (pos > 0) {
		sum += bit_table[pos - 1];
		pos -= pos & (-pos);
	}
	return sum;
}

int cmp(const void* x, const void* y) {
	int a = *(const int*)x, b = *(const int*)y;
	return (a > b) - (a < b);
}

int N;
int X[BIT_MAX];

int order[BIT_MAX];
int score[BIT_MAX];

int get_id(int query) {
	int l = 0, r = N;
	while (l <= r) {
		int m = l + (r - l) / 2;
		if (order[m] == query) return m;
		else if (order[m] < query) l = m + 1;
		else r = m - 1;
	}
	printf("ERROR: %d not found\n", query);
	exit(42);
}

int main(void) {
	int i;
	int ans = 0;
	if (scanf("%d", &N) != 1) return 1;
	for (i = 1; i <= N; i++) {
		if (scanf("%d", &X[i]) != 1) return 1;
	}
	memcpy(order, X, sizeof(*X) * (N + 1));
	qsort(order, N + 1, sizeof(*order), cmp);
	bit_add(get_id(X[0]), 1);
	bit_add(get_id(X[1]), 1);
	score[get_id(X[0])] = X[1] - X[0];
	score[get_id(X[1])] = X[1] - X[0];
	ans = (X[1] - X[0]) * 2;
	printf("%d\n", ans);
	for (i = 2; i <= N; i++) {
		int id = get_id(X[i]);
		int cur = bit_sum(id);
		int l_l, l_ge, r_le, r_g;
		int ld, rd;
		/* 左隣の人の位置を求める */
		l_l = -1;
		l_ge = id;
		while (l_l + 1 < l_ge) {
			int m = l_l + (l_ge - l_l) / 2;
			if (bit_sum(m) < cur) l_l = m; else l_ge = m;
		}
		/* 右隣の人の位置を求める */
		r_le = id;
		r_g = N + 1;
		while (r_le + 1 < r_g) {
			int m = r_le + (r_g - r_le) / 2;
			if (bit_sum(m) > cur) r_g = m; else r_le = m;
		}
		/* 最短距離を更新する */
		if (r_g <= N) {
			/* 右隣の人が存在する */
			ld = order[id] - order[l_ge];
			rd = order[r_g] - order[id];
			if (score[l_ge] > ld) {
				ans -= score[l_ge] - ld;
				score[l_ge] = ld;
			}
			if (score[r_g] > rd) {
				ans -= score[r_g] - rd;
				score[r_g] = rd;
			}
			ans += (score[id] = ld <= rd ? ld : rd);
		} else {
			/* 右隣の人が存在しない */
			ld = order[id] - order[l_ge];
			if (score[l_ge] > ld) {
				ans -= score[l_ge] - ld;
				score[l_ge] = ld;
			}
			ans += (score[id] = ld);
		}
		printf("%d\n", ans);
		bit_add(id, 1);
	}
	return 0;
}

Submission Info

Submission Time
Task D - Neighbor Distance
User mikecat
Language C23 (GCC 14.2.0)
Score 400
Code Size 2416 Byte
Status AC
Exec Time 489 ms
Memory 13328 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 400 / 400
Status
AC × 1
AC × 31
Set Name Test Cases
Sample sample_01.txt
All sample_01.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt, test_28.txt, test_29.txt, test_30.txt
Case Name Status Exec Time Memory
sample_01.txt AC 0 ms 1780 KiB
test_01.txt AC 0 ms 1836 KiB
test_02.txt AC 1 ms 1836 KiB
test_03.txt AC 283 ms 13144 KiB
test_04.txt AC 283 ms 13132 KiB
test_05.txt AC 281 ms 13004 KiB
test_06.txt AC 255 ms 13288 KiB
test_07.txt AC 257 ms 13144 KiB
test_08.txt AC 255 ms 13184 KiB
test_09.txt AC 338 ms 13000 KiB
test_10.txt AC 339 ms 13076 KiB
test_11.txt AC 341 ms 13140 KiB
test_12.txt AC 338 ms 13004 KiB
test_13.txt AC 283 ms 13100 KiB
test_14.txt AC 288 ms 13328 KiB
test_15.txt AC 283 ms 13272 KiB
test_16.txt AC 282 ms 13088 KiB
test_17.txt AC 479 ms 13240 KiB
test_18.txt AC 476 ms 13268 KiB
test_19.txt AC 479 ms 13104 KiB
test_20.txt AC 477 ms 13204 KiB
test_21.txt AC 476 ms 13124 KiB
test_22.txt AC 478 ms 13164 KiB
test_23.txt AC 479 ms 13112 KiB
test_24.txt AC 478 ms 13308 KiB
test_25.txt AC 482 ms 13300 KiB
test_26.txt AC 489 ms 13200 KiB
test_27.txt AC 487 ms 13164 KiB
test_28.txt AC 482 ms 13152 KiB
test_29.txt AC 482 ms 13148 KiB
test_30.txt AC 485 ms 13228 KiB


2025-11-07 (Fri)
07:55:18 +09:00