← Back to topics
Topic

z-pesak

n
nalism
bobo koju si strukturu koristio za ovaj zadatak?

niz od 1 000 000 elemenata moze da prodje al ako je to niz od slogova koji imaju 3 ili 2 elementa nema sanse?
d
dimitar
Pa ako ti 2 elementi su od tipa longint, onda ukupna golemina je:

2*4*1000 000 = 12MB,

a ogranicenje u zadatak je oko 8MB
n
nalism
pa da, pa da...
veoma je malo memorijsko ogranicenje, pa bih da cujem bobu posto je on to odradio!
:]
n
nalism
pa ... kako si to upotrebio?
:]
mislim, ajd da si rekao listu ili nesto slicno pa i nekako, al' ovako ne vidim vezu izmedju binarnog stabla i pomeranja peska po ravni ... !
b
boba5551
Pa kad napravis neki korak ubacis polje ako ne postoji, ako postoji samo vec postojecu vrednost uvecas za jedan i to ti je to. Ima lepse resenje, ali ja sam radio ovako. Lepse resenje nije moje, pa necu ni da ga delim :)
n
nalism
svatio sam sta si hteo da kazes...
:]
al, jel mozes, molim te, (kad budes imao vremena) da pogledas kako sam ja to zamislio i isprobao, ali mi pada na vremenu?

pojma nemam zasto pada - meni za neke moje primere prolazi i to vrlo lepo!
+ sam otkucao vrlo uredno tako da je lako za analizu!
(ako ce ti biti lakse poslacu na mail!)
:)
n
nalism
promenio sam while petlju koja je ulazila u mrtvu petlju ali sada je ona problem sto se previse sporo sve odvija tako da za 3 cetvrtine testova pada na vremenu a ostalo je dobro...
:(
b
boba5551
Znam da mogu da skinem, ali mozes mi AKO TE NE MRZI poslati na mejl, pa cu pogledati vevceras. Malo sam "kratak" sa vremenom u poslednje vreme.
r
renovator
nisam upucen u AVL , ali predpostavljam sledece :
ako se pri svakoj komandi pesak pomera na polje koje do sad nije zabelezeno onda se stvara novi element , tj. i tu postoji mogucnost stvaranja 1 000 000 elemenata?
Ako je tako , onda se mozda zadatak moze uraditi dvostruko povezanim listama (sa pointerima).
Poz.
d
dimitar
AVL je optimizacija na binarno drvo, koja garantira da negova dubina nece biti veca od logn. A resenje sa liste moze i da radi, ako koristis vector u C++, i ako dobro implementujes binary search. Probaj, ali ne verujem da ces uspeti da implementiras binary search nad vector.
d
dimitar
renovator, ne muci se, ja sam probao i pada na vremenu, samo na prvi 5 primera je proslo... Meni nije jasno zasto nije proslo, slozenost je cisto O(nlogn). Najverovatno insert u vector nije O(1)??
d
dimitar
hehe, ke treba ja i ti da naucimo neko balansirano drvo (AVL) :)
r
renovator
pa da .. naucicu AVL , ali probacu da uradim ovaj zadatak sa vectorima bez Insert-a.Znaci samo alociranje memorije i binarno pretrazivanje.
Iako predpostavljam da ce pasti na nekim primerima, probacu.
Insert u vectoru je slozenosti O(n) , bar ja tako mislim posto je to niz a ne povezana lista.O(1) je u listi.
Pozdrav.
r
renovator
ma ,kad bolje razmislim ,sto bi se mucio da radim zadatak kad znam da nece proci :)
search for AVL ... (mada stalno razmisljam o onom sto boba rece da postoji lepsi naci za rad ovog zadatka).
pozdrav.
r
renovator
ipak sam uspeo da ispisem zadatak na drugi nacin.
Medjutim , za primere >9 mi ispisuje da je greska nastala za vreme izvrsavanja.
Ako bi neko mogao da pogleda i pokusa da pronadje izvor moje greske bio bih mu mnogo zahvalan.
nego mislim da je bolje da vam posaljem na mail nego da ga uploadujem negde.
uz to cu vam i poslati objasnjenje rada (nije komplikovano).
pozdrav.
Relja.
b
boba5551
Mozda postoji sansa da ti puca zbog prekoracenja memorije. Ti svakako dinamicki zauzimas memoriju (bar sam tako shvatio) pa je mozda to.
r
renovator
da , tako sam i mislio nego malo me bunilo sto ne pise Prekoracen memorijski limit...Ali ta greska se javlja samo kod staticki alocirane memorije.Kada sam postavio matricu 300x300 prolazio je na 12-13 primera , ali vreme je ogranicavajuci faktor :)
Pozdrav.
b
boba5551
Pa zato sto ti treba puno dok ne nadjes da li si vec ubacio, zato i treba da se koristi neka druga struktura podataka ili neka bolja ideja :)
r
rajkon
I dalje mi nesto nije jasno ...

za svakog cvora u stablu potrebno je pamtiti 3 informacije (obelezje, levosin, desnisin) ... i u najgorem slucaju ce se napraviti 1 000 000 cvorova ...

kako onda nije moguce da se naprave 2 niza od 1 000 000 elemenata (longint)?
f
fpavetic
pozdrav svima!

ja imam slijedeci problem; tice se konkretno ovog zadatka ( z-pesak ) :
kada posaljem ovaj kod:

#include <cstdio>
#include <utility>
using namespace std;

struct a {
unsigned char con[3];
};

pair< a, a > V[ 1000001 ];

int main( void ) {

return 0;
}

dobijem poruku da program nije vration nulu. ne mogu nikako shvatiti zasto: memorijsko ogranicenje nije prekoraceno, nije niti vremensko. jesam li sto propustio ?
r
renovator
pa izgleda da nesto nije u redu..
Kada bi isti kod iskucao u pascalu, ne bi bilo problema..
Nesto dodatno opterecuje memoriju...
n
nrmmyth
[q]Najverovatno insert u vector nije O(1)??[/q]Ne.
Obicno polje koje se realocira po potrebi.

Moze mi tko objasnit ukratko razliku izmedju AVL i RB stabla?
a
andrejko
AVL i RB stabla su vrsta binarnog stabla pretrage, a razlikuju se samo u definiciji uravnotezenosti (koja je jelte potreba da bi garantovala slozenost logN). AVL stablo kaze da je apsolutna razlika visine levog podstabla i desnog podstabla manja ili jednaka 1, dok RB stablo kaze da na na svakom putu od cvora do njegovih listova (listova u njegovom podstablu) ima jednak broj crnih cvorova.

AVL: http://en.wikipedia.org/wiki/AVL_tree
RB: http://en.wikipedia.org/wiki/Red-black_tree
l
losvald
Al koju god strukturu uzimas, ako uzimas 2 int-a za koordinate, prekoracit ces memory limit jer je 2*4*1000000 = 8000 KB a dozvoljeno je 7168 KB ?
b
boneli
Koristi short umesto int-a, ali tako što ćeš da pamtiš kretanje po modulu nekog levog broja iz opsega short.
l
losvald
Problem u inputu?
Probo sam ucitavat sa: (char s[25]; int n;)
1) scanf("%d\n", &amp;n); pa dalje sa gets(s) za komande
2) scanf("%d%*c", &amp;n) pa dalje sa gets(s) za komande
3) scanf("%d", &amp;n); pa fflush(stdin) pa dalje gets(s) za komande

Napravio sam da program odmah nakon ucitavnja podataka ispise neko bezveze rjesenje ali program niti ne dodje do tam i vec premasi vremensko ogranicenje i to na svim test primjerima i na sva 3 gore navedena nacina. U cemu je problem?
r
renovator
ovako prolazi :

scanf("%s", &amp;cmd);
if( cmd[2] == 'l' )     _y--;
else if( cmd[2] == 'r') _y++;
else if( cmd[2] == 'v') _x--;
else if( cmd[2] == 's') _x++;
else if( cmd[2] == 't') scanf("%*s %*s %*s");

l
losvald
Izgleda da nekej ne valja s zadatkom jer opet ne prolazi na ni jednom test primjeru (cak i ako maknem sortiranje tj. ostavim samo ucitavanje). Evo source:
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#define MAX 1000002
using namespace std;
struct broj {
char a; short b;
broj() {}
inline broj(int x) {
a = x/32000;
b = x%32000;
}
};
bool operator<(const broj&amp; a, const broj&amp; b) {
if(a.a < b.a) return 1;
if(a.a > b.a) return 0;
return a.b < b.b;
}
bool operator==(const broj&amp; a, const broj&amp; b) {
return a.a == b.a &amp;&amp; a.b == b.b;
}
bool operator==(const pair<broj, broj>&amp; a, const pair<broj, broj>&amp; b) {
return a.first == b.first &amp;&amp; a.second == b.second;
}
struct comp {
bool operator()(const pair<broj, broj>&amp; a, const pair<broj, broj>&amp; b) {
if(a.first < b.first) return 1;
if(b.first < a.first) return 0;
return a.second < b.second;
}
} mojsort;
pair<broj, broj> a[MAX];
int main() {
int n; char s[10];
int x = 1000000, y = 1000000;
scanf("%d", &amp;n);
a[0] = make_pair(broj(x), broj(y));
for(int i = 1; i <= n; ++i) {
scanf("%s", &amp;s);
if(s[2] == 'r') ++y;
else if(s[2] == 'l') --y;
else if(s[2] == 'v') --x;
else if(s[2] == 's') ++x;
else scanf("%*s%*s%*s");
a[i] = make_pair(broj(x), broj(y));
}
//do ovog koraka niti ne dodje vec padne na vremenu do tuda
sort(a, a+n+1, mojsort);
int curr = 1, sol = 1;
for(int i = 1; i <= n; ++i, sol >?= curr) {
if(a[i-1] == a[i]) ++curr;
else curr = 1;
}
printf("%d", sol);
return 0;
}
r
renovator
problem nije u vremenu kako pise vec u memoriji..

inace, i ja sam imao prilicno problema sa ovim zadatkom...
Po svemu, tvoj program bi trebao da zauzima ~6MB..
Medjutim, ne znam zbog cega, ali C++ zauzima neki dodatni prostor koji
dovodi do memorijskog prekoracenja..Savetujem ti da isti program iskucas u
Pascalu i to bi trebalo da radi..Ako ti ni to ne uspe probaj sa obicnim, ne 100%, ali skoro nepogresivo tacnim hashom ;).
D
Daniel93
#include<iostream>
#include<vector>
#include<string>
using namespace std;

int main()
{
vector<int>A,B;
A.push_back(0);
B.push_back(0);
int n,x=0,y=0,i,j,MAX=0;
string s;
cin >> n;
for(i = 0; i < n; i )
{
cin >> s;
if( s == "Gore")
y = 1;
if( s == "Dole")
y -= 1;
if( s == "Levo")
x -= 1;
if( s == "Desno")
x = 1;
A.push_back(x);
B.push_back(y);
}

int time = 0;
for( i = 0; i < A.size(); i )
{
for( j = 0; j < A.size(); j )
{
if((A[i] == A[j]) && (B[i] == B[j]))
time ;
}
if(time > MAX)
MAX = time;
time = 0;
}
cout<<MAX<<endl;
return 0;
}



Ljudi pomozite mi, ovo je moj kod, i bar ja mislim da radi, ali zbog nekih razloga mi u pola primjera dode "Time limit exeded", i u drugoj polovici "Execution error or Memory limit exeded".
Need help!!!!!
D
Daniel93
CITA LI KO OVE POSTOVE__???
n
nemanja1990
Citam ja ali ne verujem da ti to nesto znaci jer ne znam c i c++ pa ne kapiram tvoj kod a i nisam ni resio ovaj zadatak :)
n
nemanja1990
Resio sam ga sad, ali sa skoro 30 mb a dozvoljeno je 7 :)

Sinula mi neka ideja, ja je ispisao, proverio da li radi, obradovao sam se kad sam video da radi, poslao i razocarao se kad sam skapirao da nisam obratio paznju na memoriju :)

Moram da pogledam taj AVL, jer ovako ne ide, a bas mi je zao, 100% je tacno resenje.
g
gates
rjesenje koje pretpostavljam da imas je vrlo jednostavno, probaj uz to iskoristiti hash da smanjiš zauzetu memoriju
D
Daniel93
Ja sam probao svasta ali dosad jos uvijek bez uspjeha----------
s
stjepang
Pa umjesto da pamtis brojeve ( x, y ), pamti samo broj ( x * P + y ), gdje je P neki prosti broj.

To ce duplo smanjiti memoriju i proci u C++-u.

Ako koristite vectore, obavezno stavite reserve ili resize, inace se kod svakog push_backa rezervira duplo veca memorija nego treba.
I da, push_back je O( 1 ), ne O( N ) :)
D
Daniel93
Meni ocito ne ide, evo linka za kod : http://www.z-trening.com/new/www/html/submit.php?submit=7100003862&subm_code=1 . Ja sam probao u toj funkciji i proste kako si rejao i sta ja znam sta vise nisam, ali mi uvijek javlja wrong result.
Ipak uzmimo primjer x = 2, y = 4, a nek prosti broj bude 7, tj. F(x,y) = 18,
u drugu ruku x = 1, y = 11, sto je isto 18, nisam upoznat bas sa tim, jer sam nov u programiranju ali ove hash funkcije bi javljale u nekim primjerama gresku. Gdje gresim....?
g
gates
ne mozes uzeti tako mali prost broj..probaj uzeti neki veci od milijun
D
Daniel93
Ma nema veze koji god broj stavim isto je, 10000003, ili sta ja znam. Stvarno mi je ne shvatljivo kako radi kod vas....
D
Daniel93
Uspjeo sam napraviti, greska je po meni u zadatku. jer za unos u string, tokom poredenjem nesto nije bilo u redu. al sad radi^^
g
gates
kad tako usporedjujes stringove, dovoljno ti je samo prvo slovo..ili negdje drugo jer i tako možeš razlikovati naredbe