Runtime error na ostatnim. Rozwiazanie nie jest optymalne.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define CARMAX 100000
int i;
struct car {
int x;
int y;
int c;
} cars[CARMAX];
int path[CARMAX];
int dupa[CARMAX];
int cmp(struct car *a, struct car *b)
{
return a->x != b->x ? a->x - b->x : a->y - b->y;
}
struct ll {
struct ll *prev;
struct ll *next;
int num;
int car;
int index;
} *list, *previous;
void dellt(struct ll *l, int c)
{
struct ll *tl;
struct ll *start = l;
l = l->next;
while (l) {
if (c > l->car) {
tl = l->next;
free(l);
l = tl;
} else if (c <= l->car) {
l->prev = start;
start->next = l;
return;
}
}
start->next = NULL;
}
void ins(int n, int c) {
struct ll *l = list;
struct ll *new;
struct ll *lt;
if (previous && previous->num < n) {
l = previous;
}
new = malloc(sizeof(struct ll));
new->num = n;
new->car = c;
new->index = i;
if (l == NULL) {
new->next = NULL;
new->prev = NULL;
path[i] = -1;
list = new;
return;
}
while (l) {
if (l->num == n) {
int a = -1,
b = l->car;
if (l->prev)
a = l->prev->car;
if (a > b) {
l->car = c + a;
path[i] = l->prev->index; /* tu blad czasami powodujacy segfault */
} else {
l->car = c + b;
path[i] = l->index;
}
l->index = i;
dellt(l, l->car);
free(new);
previous = l;
return;
} else if (l->num > n) {
new->prev = l->prev;
new->next = l;
l->prev = new;
if (new->prev) {
new->prev->next = new;
new->car += new->prev->car;
path[i] = new->prev->index;
} else {
list = new;
path[i] = -1;
}
dellt(new, new->car);
previous = new;
return;
} else {
lt = l;
l = l->next;
}
}
new->next = NULL;
new->prev = lt;
lt->next = new;
if (new->prev) {
path[i] = new->prev->index;
new->car += new->prev->car;
} else {
path[i] = -1;
}
previous = new;
}
#define READ_INT(n) n = 0; while((ch = getchar_unlocked()) >= '0') n = n * 10 + ch - '0';
int main()
{
int m, n, k;
char ch;
/* scanf("%d %d %d", &m, &n, &k); */
READ_INT(m);
READ_INT(n);
READ_INT(k);
memset(path, -1, CARMAX*4);
for (i = 0; i < k; i++) {
READ_INT(cars[i].x);
READ_INT(cars[i].y);
READ_INT(cars[i].c);
/* scanf("%d %d %d", &cars[i].x, &cars[i].y, &cars[i].c); */
}
qsort(cars, k, sizeof(struct car), (int (*)(const void *, const void *))cmp);
for (i = 0; i < k; i++) {
/* if(!(i % 100)) { printf("%d\n", i);} */
ins(cars[i].y, cars[i].c);
}
while (list->next) list = list->next;
m = 0;
i = list->index;
while (i != -1) {
dupa[m] = i;
i = path[i];
m++;
}
printf("%d\n%d\n", list->car, m);
while (m > 0) {
m--;
printf("%d %d\n", cars[dupa[m]].x, cars[dupa[m]].y);
}
return 0;
}