Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: 251 Mine  (Citit de 3192 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
ditzone
Vizitator
« : Iunie 06, 2006, 07:48:46 »

Aici puteţi discuta despre problema Mine.
Memorat
wefgef
Nu mai tace
*****

Karma: 1049
Deconectat Deconectat

Mesaje: 3.008


razboinicu' luminii


Vezi Profilul
« Răspunde #1 : Iunie 06, 2006, 18:43:54 »

ar fi fain daca nu ati pune limitele la unele probleme asa stranse.

in pascal citirea ia mai mult si chiar e greu de scos 100 pe ele.

un 0.1 in plus la limita  nu afecteaza cu nimic, ca doar nu intra brute-ul Tongue
Memorat

omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
andreit1
Vizitator
« Răspunde #2 : Iunie 06, 2006, 18:57:36 »

Lasa ca invatam si noi sa parsam citirea... sau si mai bine sa renuntam la pascal!
Memorat
greco
Nu mai tace
*****

Karma: 144
Deconectat Deconectat

Mesaje: 434



Vezi Profilul
« Răspunde #3 : Iunie 06, 2006, 19:08:51 »

Limita a fost de 0.1 secunde initial.
Memorat

Jump in the cockpit and start up the engines
Remove all the wheelblocks there's no time to waste
Gathering speed as we head down the runway
Gotta get airborne before it's too late.
wefgef
Nu mai tace
*****

Karma: 1049
Deconectat Deconectat

Mesaje: 3.008


razboinicu' luminii


Vezi Profilul
« Răspunde #4 : Iunie 06, 2006, 19:12:50 »

Lasa ca invatam si noi sa parsam citirea...

asta am si facut Tongue.
Memorat

omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
cristi8
Vizitator
« Răspunde #5 : Iunie 18, 2006, 12:59:29 »

iau doar 20 pct (in rest WA si pe vreo 4-5 teste (din 25) iau TLE) si nu stiu de ce.
eu tin un min-heap cu nodurile in care se poate ajunge, ordonat dupa costul muchiei care duce in ele.
la fiecare valoare "q" citita iau din heap primul element cat timp costul e mai mic sau egal cu valoarea citita, si adaug in heap toti vecinii nodului/nodurilor extrase.
Am grija sa marchez nodurile "relaxate", si cum am marcat nodul n opresc algoritmul.

----
alta exprimare, poate mai clara:
la fiecare valoare "q" citita (intr-o anumita stare), exista:
 - o submultime de noduri in care se poate ajunge (un vector u[] de 0 sau 1)
 - o alta submultime de noduri: vecini ai primei submultimi (retinut ca un min-heap in functie de costul muchiei).
ca sa trec de la o stare la alta, iau din a 2a multime (din heap) elementele cu costul <= decat "q" si le adaug la prima multime. bine-nteles, reimprospatez tot-odata si heap-ul cu noile noduri si costuri.
----

ce gresesc?

PS:
daca citesc muchiile cu:
Cod:
  fgets(buf, 100, stdin);
  sscanf(buf, "%d%d%d", &v1, &v2, &c);
dureaza mai mult decat:
Cod:
  scanf("%d%d%d", &v1, &v2, &c);

e normal?
« Ultima modificare: Iunie 18, 2006, 13:18:42 de către cristi8 » Memorat
wefgef
Nu mai tace
*****

Karma: 1049
Deconectat Deconectat

Mesaje: 3.008


razboinicu' luminii


Vezi Profilul
« Răspunde #6 : Iunie 18, 2006, 20:15:49 »

ai grija sa introduci vecinii nodurilor vizitate abia dupa ce termini de scos din heap?
Memorat

omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
cristi8
Vizitator
« Răspunde #7 : Iunie 18, 2006, 22:08:24 »

nu, de ce ?
uite cum fac:
Cod:
void foo(int val) {
  int x;
  vnod *q;
  while(h[1].c <= val && hn) {
    x = h[1].x;
    h[1] = h[hn--];
    hdown(1);
    if(!u[x]) {
      u[x] = 1;
      for(q = lv[x]; q; q = q->nxt)
        if(!u[q->x])
          hadd(q->x, q->c);
    }
  }
}
unde lv(i) e lista de vecini a nodului i, h e heap-ul (structura cu { int x, c; } reprezentand nodul si costul). hn e dimensiunea heap-ului
« Ultima modificare: Iunie 18, 2006, 22:12:16 de către cristi8 » Memorat
pauldb
Nu mai tace
*****

Karma: 821
Deconectat Deconectat

Mesaje: 1.901



Vezi Profilul
« Răspunde #8 : August 08, 2006, 20:40:24 »

In ce complexitate se rezolva problema?  sad
Memorat

Am zis Mr. Green
u-92
Vizitator
« Răspunde #9 : August 08, 2006, 23:57:53 »

eu am facut (M+N)*logN
Memorat
pauldb
Nu mai tace
*****

Karma: 821
Deconectat Deconectat

Mesaje: 1.901



Vezi Profilul
« Răspunde #10 : August 16, 2006, 23:56:54 »

Eu am reusit sa scot (M+N) * log M...si iau TLE pe 6 teste. Ce inseamna sa "parsezi" citirea?  Huh
Memorat

Am zis Mr. Green
greco
Nu mai tace
*****

Karma: 144
Deconectat Deconectat

Mesaje: 434



Vezi Profilul
« Răspunde #11 : August 19, 2006, 03:13:11 »

Citesti sub forma de string o linie intreaga si calculezi singur valorile din ea prin inmultiri cu 10 si adunari repetate. Cam infect, dar uneori mai e nevoie si de asa ceva. La fel se poate parsa si scrierea, insa eu unul am avut nevoie de scriere optimizata la o singura problema pana acum (de pe SGU cred).
Memorat

Jump in the cockpit and start up the engines
Remove all the wheelblocks there's no time to waste
Gathering speed as we head down the runway
Gotta get airborne before it's too late.
stocarul
Nu mai tace
*****

Karma: 49
Deconectat Deconectat

Mesaje: 203



Vezi Profilul
« Răspunde #12 : Martie 12, 2009, 17:31:31 »

Are ceva mai special testul 6?
Primesc 96 pct,cu WA pe testul 6  Brick wall
Ce poate fi ? Angry
Memorat
savim
Nu mai tace
*****

Karma: 194
Deconectat Deconectat

Mesaje: 333



Vezi Profilul
« Răspunde #13 : Septembrie 28, 2009, 16:30:08 »

Imi puteti da va rog o idee cum sa fac o citire mai rapida la problema asta?
Eu am incercat sa citesc cu fread tot fisierul intr-un string, si apoi sa lucrez pe acesta. Daca imi las doar citirea in program iau un TLE pe unul din ultimele 2 teste.  Whistle  http://infoarena.ro/job_detail/351561
« Ultima modificare: Septembrie 28, 2009, 19:54:26 de către Stan Serban Andrei » Memorat
bogdan2412
Echipa infoarena
Nu mai tace
*****

Karma: 410
Deconectat Deconectat

Mesaje: 951



Vezi Profilul
« Răspunde #14 : Septembrie 29, 2009, 12:16:04 »

Poti face functia read_file() inline si, de asemenea, poti folosi un pointer la pozitia curenta in sir, in loc de un int.

Un exemplu pentru toata lumea:
Cod:
char *p = s;

inline int read_value() {
    int val = 0;
    for (; '0' <= *p && *p <= '9'; p++)
        val = val * 10 + *p - '0';
    p++;
    return val;
}

a = read_value(); b = read_value();

Facand modificarile astea 2, sursa ta (fara rezolvare, doar citire) intra in timp in 190 ms Smile. Aparent, nu citirea dureaza cel mai mult la tine, ci ce faci cu vectorul arb in functia cit. Cred ca spargi cache-ul parcurgandu-l in ordine inversa. Incearca sa folosesti altceva decat arbori de intervale.
« Ultima modificare: Octombrie 17, 2009, 16:28:03 de către Bogdan Tataroiu » Memorat
savim
Nu mai tace
*****

Karma: 194
Deconectat Deconectat

Mesaje: 333



Vezi Profilul
« Răspunde #15 : Septembrie 29, 2009, 15:09:50 »

Merci de sfat. Am folosit citirea prezentata de tine, insa ca optimizare am tinut graful fara vectori (o lista cu muchii, si pentru fiecare nod sa tin minte de unde ii incep muchiile). Smile
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines