infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Cosmin Negruseri din Iunie 01, 2006, 18:28:51



Titlul: 249 Panouri
Scris de: Cosmin Negruseri din Iunie 01, 2006, 18:28:51
Aici puteţi discuta despre problema Panouri (http://infoarena.ro/problema/panouri).


Titlul: Raspuns: 249 Panouri
Scris de: Savin Tiberiu din Iunie 17, 2006, 15:55:23
cam ce complexitate ar trebui la problema asta pentru ca eu am facut un N*T si nu iau decat 50 de puncte. Ar trebui sa incerc sa mai caut niste optimizari sau exista un algoritm mai rapid?????


Titlul: Raspuns: 249 Panouri
Scris de: Rimovecz Ioan Mihai din Iunie 17, 2006, 16:01:14
Pai complexitatea ii NlogN. Hint cauta binar lungimea. Problemele astea ii clasice incearca sa faci si secventa 3 ideea ii cam aceeasi.


Titlul: Raspuns: 249 Panouri
Scris de: Mircea Pasoi din Iunie 17, 2006, 16:11:36
Se poate rezolva si in O(N+T).


Titlul: Raspuns: 249 Panouri
Scris de: Rimovecz Ioan Mihai din Iunie 17, 2006, 16:33:04
da cred ca de aia luam numai 80p.


Titlul: Raspuns: 249 Panouri
Scris de: Cosmin Negruseri din Iunie 17, 2006, 20:59:03
Nu prea vad nici o asemanare intre secventa 3 si problema asta, decat ca sunt amandoua probleme in care trebuie sa dai ca rezultat o secventa.


Titlul: Raspuns: 249 Panouri
Scris de: Savin Tiberiu din Iunie 18, 2006, 15:13:57
Asemanare dintre secventa 3 si panouri e ca el le-a rezolvat la fel, probabil cautand binar lungimea (deshi nu inteleg ce lungime cauta el la secventa 3 ptr ca acolo nu lungimea e baza ci costul dar ma rog). Oricum asta inseamna ca tre sa caut alta rezolvare, oare cum ash putea face O(N)  :-'


Titlul: Raspuns: 249 Panouri
Scris de: Rus Cristian din Iunie 18, 2006, 20:58:49
nu am facut problema inca...dar probabil e o coada...


Titlul: Raspuns: 249 Panouri
Scris de: Cosmin Negruseri din Iunie 19, 2006, 01:43:50
:) pai cum rezolvarea e O(n) ar fi cam nasol sa fie rezolvarea bazata pe un arbore binar de cautare :).


Titlul: Re: 249 Panouri
Scris de: Sima Mihai Cotizo -vechi din Iulie 23, 2006, 12:16:55
ok, la ONI am facut in n*t si am luat 100, aici iau 0... nu merge :D
problema e alta: am facut-o si in O(n) cu o coada, am 8 WA si 2 TLE... am incercat sa citesc doar si sa afisez direct -1, fara sa mai procesez datele.. si inca iau  1 TLE ( uneori 2, ideea e ca e la limita)

postez si citirea...
Cod:
void read_data()
{
long i, tmp;

freopen(FIN, "r", stdin);
scanf("%ld %ld", &N, &T);
for (i=0; i<N; ++i)
scanf("%ld", A+i);
for (i=0; i<T; ++i)
{
scanf("%ld", &tmp);
C[tmp]=1;
}
fclose(stdin);
}
trebuie sa citesc mai eficient?


Titlul: Raspuns: 249 Panouri
Scris de: Savin Tiberiu din Iulie 23, 2006, 14:11:45
eu cu n*t iau 50 de pct si in rest TLE.


Titlul: Raspuns: 249 Panouri
Scris de: u-92 din Iulie 23, 2006, 19:25:37
am luat 100 citind cu scanf.. dar daca din cauza asta iei tle de ce nu bagi un fgets si rezolvi problema


Titlul: Raspuns: 249 Panouri
Scris de: Cosmin Negruseri din Iulie 23, 2006, 20:45:35
Ai luat 100 cu O(n*t)??


Titlul: Raspuns: 249 Panouri
Scris de: u-92 din Iulie 23, 2006, 21:12:45
nu :) spuneam numai de citire


Titlul: Raspuns: 249 Panouri
Scris de: Cosmin Negruseri din Iulie 23, 2006, 21:53:00
M-am linistit. Mare pacat ca la Oni s-a luat 100 cu N*T, problema a fost facuta mai slaba ca sa intre in timp si in Borland ... pacat.


Titlul: Raspuns: 249 Panouri
Scris de: cristi8 din Noiembrie 19, 2006, 18:51:58
merge si N*logT de 100 :) (cu un min-heap)


Titlul: Raspuns: 249 Panouri
Scris de: Paul-Dan Baltescu din Noiembrie 19, 2006, 21:59:09
Merge si O(N+T).  :P


Titlul: Raspuns: 249 Panouri
Scris de: Cosmin Negruseri din Noiembrie 20, 2006, 02:17:41
O(n + t) e si solutia oficiala.


Titlul: Răspuns: 249 Panouri
Scris de: Dragos-Alin Rotaru din Noiembrie 04, 2009, 08:47:57
Ar trebui "acordata" fraza asta:
Citat
Cel mai scurta secventa care contine[....]
Nu ca ma deranjeaza dar ati spus ca ar trebui sa raportam orice greseala care scade calitatea enuntului. :)


Titlul: Răspuns: 249 Panouri
Scris de: Paul-Dan Baltescu din Noiembrie 04, 2009, 09:00:33
Am modificat.


Titlul: Răspuns: 249 Panouri
Scris de: Alexandru-Iancu Caragicu din Noiembrie 11, 2009, 19:53:40
Si eu am facut O(N+T)   (asta daca +T reprezinta citirea panourilor, altfel O(N)) si iau 30 puncte??? Am testat programul pe testele oficiale (si sub Windows, si sub Linux), imi merge perfect, raspunde instant si corect pe testele mari (alea mici nu le-am testat, sigur merg).  :eyebrow:

Sa fie de la scanf?

_______________Mai tarziu________________________________________-

30 de puncte cu scanf si 100 de puncte cu fstream. Oare de ce se recomanda sa folosim scanf (am mai auzit din diferite locuri)?


Titlul: Răspuns: 249 Panouri
Scris de: Pripoae Teodor Anton din Noiembrie 11, 2009, 20:49:03
Se recomanda sa implementezi cum trebuie :). Eu am luat 100 cu scanf.


Titlul: Răspuns: 249 Panouri
Scris de: Alexandru-Iancu Caragicu din Noiembrie 12, 2009, 12:56:43
Am implementat cum trebuie pt ca aici programul imi merge pe toate testele oficiale f bine.
Ideea e ca exact aceeasi sursa ia 30 pct cu scanf si 100 pct cu fstream.


Titlul: Răspuns: 249 Panouri
Scris de: Andrei Grigorean din Noiembrie 12, 2009, 21:22:37
Pe ultimele versiuni de gcc merge mai repede sa citesti cu streamuri.

M-am uitat aleator prin niste surse de 100 si majoritatea citeau cu scanf. Probabil ca tie iti merge mai incet din cauza ca folosesti 2 functii pe care le apelezi destul de des. Muta codul si renunta la cele 2 functii. Ar trebui sa mearga mai repede.

Astfel de probleme, pentru care se cere o solutie O(N), trebuie implementate cu grija. De obicei limita de timp este destul de stransa pentru a nu permite solutiilor O(N log N) optimizate sa intre in timp.


Titlul: Răspuns: 249 Panouri
Scris de: Pripoae Teodor Anton din Noiembrie 13, 2009, 00:23:37
Am implementat cum trebuie pt ca aici programul imi merge pe toate testele oficiale f bine.
Ideea e ca exact aceeasi sursa ia 30 pct cu scanf si 100 pct cu fstream.

Nu am spus nicaieri ca nu este corecta, ci doar ca daca implementezi cu grija iei 100 fara fstream, parsare etc. Ideea e ca nu prea sti care merge mai repede. La unele concursuri merge mai bine stdio (campion), la altfel merg mai bine streamurile, cel mai bine implementezi sursa astfel incat sa nu ai nevoie de optimizari d-astea.


Titlul: Răspuns: 249 Panouri
Scris de: Andrei Grigorean din Noiembrie 13, 2009, 01:53:05
La .campion merge mai repede citirea in C pentru ca ei folosesc un compilator mai vechi (poate ar merge un upgrade?  :)). Va trece un timp pana cand toate concursurile vor fi evaluate sub o versiune destul de noua de gcc. Daca timpul e strans si ai impresia ca sursa e la limita, cel mai sigur e sa parsezi.


Titlul: Răspuns: 249 Panouri
Scris de: Tudor Tiplea din Noiembrie 30, 2011, 18:46:26
Salut! Poate cineva sa verifice testele sau sa imi spuna daca gresesc ceva, am trimis doar asta
Cod:
#include <fstream>

using namespace std;

ifstream f("panouri.in");
ofstream g("panouri.out");

int n,t,v[200001],i,x;

int main() {
    f >> n >> t;
    for (i=1;i<=n;i++) f >> v[i];
    for (i=1;i<=t;i++) {
        f >> x;
    }
    f.close();g.close();
    return 0;
}
pentru ca nu imi intra in timp si nici macar citirea de mai sus nu intra in timp pe ultimele teste.


Titlul: Răspuns: 249 Panouri
Scris de: Marian Darius din Decembrie 25, 2012, 16:01:21
Ma poate ajuta si pe mine cineva? Iau 80p cu TLE pe testele 8 si 10, chiar daca am complexitatea O(N+T).

cod:
#include<fstream>
#include<iostream>
using namespace std;
int a[ 200005 ],f[ 20005 ],ff[ 20005 ],f_sol[ 20005 ];
ifstream in ("panouri.in");
ofstream out("panouri.out");
int main()
{
    int n,i,T,x,nr1=0,p,u,min=2000000;
    in>>n>>T;
    for(i=1;i<=n;i++)
        {in>>a[ i ];f_sol [ a [ i ] ]++;}
    for(i=1;i<=T;i++)
        {
            in>>x;
            ff [ x ] ++;
        }
    p=u=1;
    if(ff[a[1]]) nr1=1;
    else nr1=0;
    f[a[1]]++;
    while(u<=n)
        {
            while(p<=u && nr1==T)
                {
                if(u-p<min) min=u-p;
                f[a[p]]--;
                if(ff[a[p]] && f[a[p]]==0) nr1--;
                    p++;
                }
            while( u <= n && nr1 != T )
                {
                u++;
                f[ a [ u ] ]++;
                if(ff [ a [ u ] ] && f [ a [ u ] ] == 1)
                    nr1++;
                }
        }
    if(min!=2000000)
        out<<min<<endl;
    else
        out<<"-1"<<endl;
    return 0;
}

Daca un admin considera ca nu e bine ca am postat codul, sa il stearga :)


Titlul: Răspuns: 249 Panouri
Scris de: Salajan Razvan din Decembrie 25, 2012, 16:10:02
Pentru 100 ai nevoie de parsare.