5 - Ograde
Vremensko ograničenje | Memorijsko ograničenje |
---|---|
1000ms | 64MB |
Pre oko dvadeset hiljada godina, praistorijski ljudi (pećinci) su usavršili veštinu izrade drvenih ograda kako bi zadržali dobre stvari blizu sebe i loše stvari daleko od sebe. Pećinac Dimitrije je stručnjak u izradi konveksnih ograda (pećincima nikada nije bilo jasno šta ovo znači) i svima je poznato da on pravi najbolje ograde u plemenu. Najveći neprijatelj pećinačkih ograda su džinovski praistorijski crvi. Džinovski praistorijski crvi imaju naviku da s vremena na vreme izađu na površinu zemlje i krenu ka severu ili ka jugu rušeći sve pred sobom pre nego što se vrate pod zemlju. Dimitrije je upravo dobio poruku od Pećinca Njuškala da su prethodne noći džinovski praistorijski crvi opet izronili na površinu i potencijalno uništili jednu od Dimitrijevih ograda. Zajedno sa ovom porukom dobio je i sve putanje džinovskih praistorijskih crva prethodne noći. Dimitrija sada interesuje koliko stabala sekvoje on mora da poseče u strašnoj šumi, ako se zna da je za svaki uništeni segment ograde potrebno po jedno stablo sekvoje. On vas moli da mu vi kažete minimalan broj ovih stabala kako bi on proveo što manje vremena u strašnoj šumi.
Opis ulaza
Prva linija standardnog ulaza sadrži prirodan broj \(N\) - broj segmenata od kojih je Dimitrijeva ograda izgrađena. Narednih \(N\) linija sadrže po 2 cela broja \(x_i\) i \(y_i\) koji označavaju krajeve svih segmenata ograde (dati su redom u smeru kazaljke na satu i uvek formiraju konveksni mnogougao), tj \(i\)-ti segment počinje na poziciji \((x_i,y_i)\) i završava se na poziciji (xi+1,yi+1) pri čemu \(N\)-ti segment počinje na poziciji \((x_N ,y_N)\) i završava se na poziciji \((x_1,y_1)\). Naredna linija sadrži broj \(M\) - broj putanja džinovskih praistorijskih crva. Narednih \(M\) linija sadrže po 3 cela broja \(a_i , p_i\) i \(k_i\) koji opisuju kretanje jednog od džinovskih praistorijskih crva tj. da se crv kretao između tačaka \((a_i,p_i)\) i \((a_i,k_i)\). Segment ograde se smatra uništenim ako se u bar jednoj tački seče sa putanjamadžinovskih praistorijskih crva, dakle ako crvi prođu kroz zajedničku tačku dva segmenta, oba segmenta se smatraju uništenima. Takođe, ako crvi izađu na površinu tačno na mestu gde je ograda, ili se vrate nazad u zemlju u tački koja pripada segmentu ograde, taj segment se takođe smatra srušenim. Krajevi segmenata ograde zadovoljavaju uslov da nikoja tri nisu kolinearna.
Opis izlaza
Prva i jedina linija izlaza treba da sadrži tačno jedan ceo broj - broj stabala koji Dimitrije mora da poseče u strašnoj šumi.
Primer 1
Ulaz
Izlaz
Objašnjenja primera
U prvom primeru su uništena 4 segmenta: segment sa krajnjim tačkama u (-3, 4) i (-8, 2), segment sa krajnjim tačkama u (-11, 0) i (-1, -4), segment sa krajnjim tačkama (-1, -4) i (11,0), kao i segment sa krajnjim tačkama (6, 3) i (-3, 4).
Ograničenja
- \(3 ≤ N ≤ 10^5\)
- \(1 ≤ M ≤ 10^5\)
- \(−10^7 ≤ x_i, y_i, a_i, p_i, k_i ≤ 10^7\)
Napomena
Test primeri su podeljeni u 3 grupe:
- u 20% test primera ograda će biti u obliku jednakokrakog pravouglog trougla čija je hipotenuza paralelna x osi ili u obliku kvadrata čije su stranice zarotirane za 45◦ u odnosu na koordinatne ose
- u 40% test primera važiće da je \(N · M ≤ 10^6\)
- ostali primeri nemaju ograničenja
Autor | Tekst i test primeri | Analiza rеšenja | Testiranje |
---|---|---|---|
Demjan Grubić | Lazar Milenković | Aleksandar Višnjić | Demjan Grubić |
Prvi i drugi podzadatak:
Za svakog crva i ogradu proveravamo da li je taj crv uništio tu ogradu, odnosno da li se njihove duži seku. To je moguće uraditi preko mešovitog proizvoda vektora, odnosno orijentacije trougla. Duži \(AB\) i \(CD\) se seku akko trouglovi \(ABC\) i \(ABD\) imaju suprotnu orijentaciju. Složenost je \(O(N\cdot M)\).
Glavno rešenje:
Sortiramo sve crve po \(x\) koordinati i segmente ograde podelimo u dva sortirana niza (isto po \(x\) koordinati levog kraja) - "gornji omotač" i "donji omotač". Zadatak rešavamo prvo za jedan, pa onda za drugi omotač. To radimo tehnikom two pointers. Za svaki segment ograde odredimo koji crvi zadovoljavaju to da se njihova \(x\) koordinata nalazi između \(x\) koordinata krajeva segmenta. Nakon toga, imamo skup crva koji mogu seći dati segment. Ostalo je to još samo proveriti. Složenost je \(O(NlogN)\) zbog sortiranja i zato što po svakom crvu prolazimo najviše \(4N\) puta.
05_ograde.cpp | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
|