Zadanie na liście jednokierunkowej (?)

0

Witam, dostałem do napisania algorytm, dokładna treść zadania tu: http://wklej.org/id/1872313/txt/
Dla wszystkich przykładowych danych z treści zadania mój program działa dobrze. Niestety sprawdzany jest na platformie à la spoj, gdzie przechodzi tylko jeden test - zwrócenie wyniku -1 w wypadku braku danych...
Danych testowych oczywiście nie znam, w związku z czym nie mogę znaleźć błędu w moim programie. Mógłbym liczyć na pomoc w znalezieniu błędu w moim rozumowaniu?
Poniżej kod:

#include <stdio.h>
#include <stdlib.h>
#define gc getchar
struct Elem;
Elem* tmp;
Elem* tmp2;
int dlugosc=0;
int lim;
struct Elem {
    Elem* p;
    Elem* n;
    int x;
    Elem (int c){
        p = NULL;
        n = NULL;
        x = c;
    }
    void R(){
        tmp2 = tmp->n->n;
        lim = tmp->n->x;
        delete tmp->n;
        dlugosc--;
        tmp->n=tmp2;
        for (int i=0; i<lim; i++) tmp=tmp->n;
    }

    void X(){
        tmp2 = tmp->n;
        tmp->n = new Elem((tmp->x)-1);
        tmp->n->n=tmp2;
        dlugosc++;
        lim = tmp->x;
        for (int i=0; i<lim; i++) tmp=tmp->n;
    }
};
void scan_integer( int* o ){
    register int c = gc();
    if (c!=EOF){
        int x = 0;
        for( ; ((c<48 || c>57)); c = gc() );
        for( ;c>47 && c<58; c = gc() ) {
            x = (x << 1) + (x << 3) + c - 48;
        }
        *o = x;
    }else *o=EOF;
}
int main()
{
    int t;
    int c;
    scan_integer(&t);
    if (t==EOF){printf("%d", -1); return 0;}
    scan_integer(&c);
    if (c==EOF){printf("%d", -1); return 0;}
    Elem * pierwszy = new Elem(c);
    dlugosc++;
    scan_integer(&c);
    tmp = pierwszy;
    while(c != EOF){
        tmp->n=new Elem(c);
        tmp->n->p = tmp;
        tmp = tmp->n;
        dlugosc++;
        scan_integer(&c);
    }
    tmp->n=pierwszy;
    tmp = pierwszy;
    for(int i=0; i<t; i++){
        if (tmp->x % 2 == 0) tmp->R();
        else tmp-> X();
    }
    for (int i=0; i<dlugosc; i++){
        printf("%d ", tmp->x);
        tmp = tmp->n;
    }
    return 0;
}
 

Wczytywanie nastawione na szybkość, działa chyba dobrze. Kwestia pojemności intów chyba też nie ma tu znaczenia, bo nawet zmiana każdego inta w programie na long long inta nie zmienia wyniku, także błąd jest chyba gdzieś w samym algorytmie (operacje R, X i ich wywołanie?)

Program pisałem również z użyciem vectora, niestety z identycznym skutkiem, a tak powinno chyba być szybciej.
Z góry dziękuję za wszelkie wskazówki.

0

Przepraszam za post pod postem, ale jako gość nie mam możliwości edycji. W powyższym kodzie nie powinno oczywiście być pola Elem * p; jako że jest niepotrzebne, ale nie ma to wpływu na działanie ;) Wkleiłem po prostu pierwotną postać kodu, w której jeszcze sporo potem grzebałem.

1
  1. Trzeba zrobić to zadanie na drzewie binarnym równoważonym. Masz przesunięcie wskaźnika o C, dla listy koszt O(C), dla drzewa koszt O(log(n)).
  2. Masz koszmarne wczytywanie, pozostań przy: while(scanf(" %d",&value)==1) add_to_conatner(value); lub while(cin>>value) add_to_conatner(value);
0

A mógłbym prosić o jakąś radę nt. wstawiania/uporządkowania danych w drzewie tak, żeby było zrównoważone?
Nie bardzo wiem jak to zrobić nie znając z góry ilości danych albo ich nie sortując, co zepsułoby kolejność.

0

Faktycznie, problemem było wczytywanie, coś nie do końca tak jak trzeba wczytywało EOFa.
Teraz algorytm działa, ma tylko zbyt dużą złożoność i przekracza limit czasu w ostatnich testach, ale drzewa już chyba nie wymyślę. Dziękuję.

0

Możesz użyć standardowego rb_tree https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a01978.html i trochę go przerobić.

0

Keywords: drzewo czerwono-czarne, drzewo AVL

1 użytkowników online, w tym zalogowanych: 0, gości: 1