Submission #70727491
Source Code Expand
Copy
#include <stdio.h>#include <stdlib.h>#include <string.h>#define BIT_MAX 512345int 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];
#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 |
|
|
| 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 |