Submission #71971094
Source Code Expand
Copy
#include <stdio.h>#include <stdlib.h>#define INF 1010101010#define KI_MAX (1 << 19) /* 524288 */struct minmax_s {int min, max;};struct minmax_s merge(struct minmax_s a, struct minmax_s b) {return (struct minmax_s){a.min <= b.min ? a.min : b.min,a.max >= b.max ? a.max : b.max};}struct minmax_s ki[KI_MAX * 2 - 1];void ki_set(int pos, int value) {
#include <stdio.h>
#include <stdlib.h>
#define INF 1010101010
#define KI_MAX (1 << 19) /* 524288 */
struct minmax_s {
int min, max;
};
struct minmax_s merge(struct minmax_s a, struct minmax_s b) {
return (struct minmax_s){
a.min <= b.min ? a.min : b.min,
a.max >= b.max ? a.max : b.max
};
}
struct minmax_s ki[KI_MAX * 2 - 1];
void ki_set(int pos, int value) {
pos += KI_MAX - 1;
ki[pos] = merge(ki[pos], (struct minmax_s){ value, value });
do {
pos = (pos - 1) / 2;
ki[pos] = merge(ki[pos * 2 + 1], ki[pos * 2 + 2]);
} while (pos > 0);
}
struct minmax_s ki_get_i(int idx, int ss, int se, int qs, int qe) {
if (se <= qs || qe <= ss) { /* 完全に外れている */
return (struct minmax_s){ INF, -INF };
} else if (qs <= ss && se <= qe) { /* セグメントがクエリに完全に含まれる */
return ki[idx];
} else {
int sm = ss + (se - ss) / 2;
return merge(
ki_get_i(idx * 2 + 1, ss, sm, qs, qe),
ki_get_i(idx * 2 + 2, sm, se, qs, qe)
);
}
}
struct minmax_s ki_get(int qs, int qe) {
return ki_get_i(0, 0, KI_MAX, qs, qe);
}
int cmp(const void* x, const void* y) {
int a = *(const int*)x, b = *(const int*)y;
return (a > b) - (a < b);
}
int zac;
int zal[KI_MAX];
int zaq(int query) {
int l = 0, r = zac - 1;
while (l <= r) {
int m = l + (r - l) / 2;
if (zal[m] == query) return m;
else if (zal[m] < query) l = m + 1; else r = m - 1;
}
printf("ERROR: %d not found!\n", query);
exit(72);
}
int N;
int C[KI_MAX], X[KI_MAX];
int left[KI_MAX], right[KI_MAX];
int main(void) {
int i;
if (scanf("%d", &N) != 1) return 1;
for (i = 0; i < N; i++) {
if (scanf("%d%d", &C[i], &X[i]) != 2) return 1;
zal[i] = X[i];
}
zal[N] = -INF;
zal[N + 1] = INF * 2;
qsort(zal, N + 2, sizeof(*zal), cmp);
for (i = 1, zac = 1; i < N + 2; i++) {
if (zal[i] != zal[zac - 1]) zal[zac++] = zal[i];
}
for (i = 0; i < (int)(sizeof(ki) / sizeof(*ki)); i++) {
ki[i] = (struct minmax_s){ INF, -INF };
}
ki_set(zaq(-INF), -1);
ki_set(zaq(INF * 2), -1);
for (i = 0; i < N; i++) {
ki_set(zaq(X[i]), C[i]);
}
for (i = 0; i < zac; i++) left[i] = INF;
for (i = 1; i < zac - 1; i++) {
int no = i - 1, yes = zac - 1;
while (no + 1 < yes) {
int m = no + (yes - no) / 2;
struct minmax_s minmax = ki_get(i, m + 1);
if (minmax.min != minmax.max) yes = m; else no = m;
}
right[i] = left[yes] = zal[yes] - zal[i];
}
/* 左と同じ国のため、左にブロックされて来なかった所を埋める */
for (i = 1; i < zac - 1; i ++) {
if (left[i] >= INF && left[i - 1] < INF) left[i] = left[i - 1] + (zal[i] - zal[i - 1]);
}
for (i = 0; i < N; i++) {
int pos = zaq(X[i]);
printf("%d\n", left[pos] <= right[pos] ? left[pos] : right[pos]);
}
return 0;
}
/*
セグメント木で国の最小と最大を管理する
最小または最大が自分の出身国と異なる → 自分と違う出身国の選手が居る
→ TLEしたので、もうひと工夫
左(位置が小さい)の選手から見て右の選手の距離 → 右の選手から見て左の選手の距離も同じ
なので、右→左の探索は省略できる
*/
Submission Info
| Submission Time | |
|---|---|
| Task | C - 座席 2 (Seats 2) |
| User | mikecat |
| Language | C23 (GCC 14.2.0) |
| Score | 100 |
| Code Size | 3243 Byte |
| Status | AC |
| Exec Time | 1098 ms |
| Memory | 17276 KiB |
Judge Result
| Set Name | Sample | Subtask1 | Subtask2 | Subtask3 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Score / Max Score | 0 / 0 | 20 / 20 | 40 / 40 | 40 / 40 | ||||||||
| Status |
|
|
|
|
| Set Name | Test Cases |
|---|---|
| Sample | sample-01.txt, sample-02.txt, sample-03.txt |
| Subtask1 | 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt, 01-25.txt, sample-01.txt, sample-02.txt, sample-03.txt |
| Subtask2 | 02-01.txt, 02-02.txt, 02-03.txt, 02-04.txt, 02-05.txt, 02-06.txt, 02-07.txt, 02-08.txt, 02-09.txt, 02-10.txt, 02-11.txt, 02-12.txt, 02-13.txt, 02-14.txt, 02-15.txt, 02-16.txt, 02-17.txt, 02-18.txt, 02-19.txt, 02-20.txt, 02-21.txt, 02-22.txt, 02-23.txt, sample-01.txt, sample-02.txt, sample-03.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-25.txt |
| Subtask3 | 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt, 01-25.txt, 02-01.txt, 02-02.txt, 02-03.txt, 02-04.txt, 02-05.txt, 02-06.txt, 02-07.txt, 02-08.txt, 02-09.txt, 02-10.txt, 02-11.txt, 02-12.txt, 02-13.txt, 02-14.txt, 02-15.txt, 02-16.txt, 02-17.txt, 02-18.txt, 02-19.txt, 02-20.txt, 02-21.txt, 02-22.txt, 02-23.txt, 03-01.txt, 03-02.txt, 03-03.txt, 03-04.txt, 03-05.txt, 03-06.txt, 03-07.txt, 03-08.txt, 03-09.txt, 03-10.txt, 03-11.txt, 03-12.txt, 03-13.txt, 03-14.txt, 03-15.txt, 03-16.txt, 03-17.txt, 03-18.txt, 03-19.txt, 03-20.txt, 03-21.txt, 03-22.txt, 03-23.txt, sample-01.txt, sample-02.txt, sample-03.txt |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| 01-01.txt | AC | 5 ms | 9916 KiB |
| 01-02.txt | AC | 5 ms | 9984 KiB |
| 01-03.txt | AC | 4 ms | 9900 KiB |
| 01-04.txt | AC | 5 ms | 9856 KiB |
| 01-05.txt | AC | 5 ms | 9920 KiB |
| 01-06.txt | AC | 5 ms | 9920 KiB |
| 01-07.txt | AC | 5 ms | 9888 KiB |
| 01-08.txt | AC | 5 ms | 10012 KiB |
| 01-09.txt | AC | 4 ms | 9940 KiB |
| 01-10.txt | AC | 4 ms | 10028 KiB |
| 01-11.txt | AC | 4 ms | 9984 KiB |
| 01-12.txt | AC | 5 ms | 9916 KiB |
| 01-13.txt | AC | 4 ms | 9972 KiB |
| 01-14.txt | AC | 5 ms | 9760 KiB |
| 01-15.txt | AC | 4 ms | 9984 KiB |
| 01-16.txt | AC | 5 ms | 10116 KiB |
| 01-17.txt | AC | 4 ms | 9968 KiB |
| 01-18.txt | AC | 4 ms | 10024 KiB |
| 01-19.txt | AC | 4 ms | 9964 KiB |
| 01-20.txt | AC | 5 ms | 9876 KiB |
| 01-21.txt | AC | 5 ms | 9964 KiB |
| 01-22.txt | AC | 5 ms | 10060 KiB |
| 01-23.txt | AC | 5 ms | 9920 KiB |
| 01-24.txt | AC | 4 ms | 9792 KiB |
| 01-25.txt | AC | 4 ms | 9836 KiB |
| 02-01.txt | AC | 534 ms | 13172 KiB |
| 02-02.txt | AC | 984 ms | 15820 KiB |
| 02-03.txt | AC | 520 ms | 13276 KiB |
| 02-04.txt | AC | 989 ms | 15836 KiB |
| 02-05.txt | AC | 376 ms | 14244 KiB |
| 02-06.txt | AC | 112 ms | 13452 KiB |
| 02-07.txt | AC | 82 ms | 13496 KiB |
| 02-08.txt | AC | 60 ms | 13456 KiB |
| 02-09.txt | AC | 993 ms | 15948 KiB |
| 02-10.txt | AC | 112 ms | 13516 KiB |
| 02-11.txt | AC | 1009 ms | 16280 KiB |
| 02-12.txt | AC | 112 ms | 13472 KiB |
| 02-13.txt | AC | 1035 ms | 16684 KiB |
| 02-14.txt | AC | 112 ms | 13520 KiB |
| 02-15.txt | AC | 1098 ms | 17232 KiB |
| 02-16.txt | AC | 113 ms | 13408 KiB |
| 02-17.txt | AC | 80 ms | 15160 KiB |
| 02-18.txt | AC | 72 ms | 15012 KiB |
| 02-19.txt | AC | 874 ms | 16780 KiB |
| 02-20.txt | AC | 699 ms | 16628 KiB |
| 02-21.txt | AC | 846 ms | 15816 KiB |
| 02-22.txt | AC | 802 ms | 15360 KiB |
| 02-23.txt | AC | 67 ms | 13496 KiB |
| 03-01.txt | AC | 878 ms | 15124 KiB |
| 03-02.txt | AC | 990 ms | 15840 KiB |
| 03-03.txt | AC | 150 ms | 10972 KiB |
| 03-04.txt | AC | 988 ms | 15840 KiB |
| 03-05.txt | AC | 421 ms | 12656 KiB |
| 03-06.txt | AC | 984 ms | 15816 KiB |
| 03-07.txt | AC | 875 ms | 15208 KiB |
| 03-08.txt | AC | 986 ms | 15748 KiB |
| 03-09.txt | AC | 997 ms | 16012 KiB |
| 03-10.txt | AC | 117 ms | 13460 KiB |
| 03-11.txt | AC | 1014 ms | 16276 KiB |
| 03-12.txt | AC | 117 ms | 13520 KiB |
| 03-13.txt | AC | 1042 ms | 16684 KiB |
| 03-14.txt | AC | 117 ms | 13476 KiB |
| 03-15.txt | AC | 1090 ms | 17276 KiB |
| 03-16.txt | AC | 119 ms | 13492 KiB |
| 03-17.txt | AC | 78 ms | 15176 KiB |
| 03-18.txt | AC | 79 ms | 15172 KiB |
| 03-19.txt | AC | 712 ms | 16476 KiB |
| 03-20.txt | AC | 710 ms | 16692 KiB |
| 03-21.txt | AC | 694 ms | 15016 KiB |
| 03-22.txt | AC | 749 ms | 15208 KiB |
| 03-23.txt | AC | 76 ms | 13548 KiB |
| sample-01.txt | AC | 4 ms | 9876 KiB |
| sample-02.txt | AC | 4 ms | 9988 KiB |
| sample-03.txt | AC | 4 ms | 9856 KiB |