6 - Trouglovi
Vremensko ograničenje | Memorijsko ograničenje |
---|---|
1000ms | 64MB |
Mali Srba pravi novu verziju igrice “Flappy Bird”. Odlučio je da prepreke više ne budu cevi, već trouglovi koji će lebdedi u vazduhu.
Odlučio je da će trouglove crtati tako što će na početku izabrati \(N\) različitih tačaka u ravni. Svaka prepreka će biti trougao koji ima temena u neke tri od izabranih tačaka. Nakon što se prepreka pređe, pravi se nova prepreka koja nije ista kao ni jedna prethodna (dve prepreke su različite ako odgovarajući trouglovi imaju bar jedno različito teme).
Da bi igra izgledala lepše, on će birati samo trouglove čiji su svi uglovi oštri.
Malog Srbu zanima kada odabere početne tačke, koliko će igra biti duga, odnosno, koliko će najviše prepreka postojati u igri?
Ulaz
U prvom redu standardnog ulaza se nalazi jedan ceo broj \(N\) koji predstavlja broj tačaka koje je mali Srba izabrao. U sledećih \(N\) redova se nalaze po dva realna broja \(X_i\) i \(Y_i\) koji predstavljaju koordinate tačaka. Koordinate će biti zapisane sa najviše \(3\) decimale.
Izlaz
U prvom i jedinom redu standardnog izlaza ispisati broj različitih prepreka koje će postojati u novoj igri.
Primer 1
Ulaz
Izlaz
Objašnjenje primera
Mali Srba može napraviti \(3\) različita oštrougla trougla, i to su trouglovi koje čine tačke:
- \((0.0, 0.0)\), \((3.0, 0.0)\) i \((1.1, 2.0)\);
- \((0.0, 0.0)\), \((3.0, 0.0)\) i \((2.1, 2.0)\);
- \((1.0, 0.0)\), \((3.0, 0.0)\) i \((2.1, 2.0)\).
Ograničenja
- \(1\leq N \leq 1000\).
- \(-10^6 \leq X_i, Y_i \leq 10^6\).
Test primeri su podeljeni u dve disjunktne grupe:
- U test primerima vrednim \(50\) poena važi \(1\leq N\leq 100\).
- U test primerima vrednim \(50\) poena nema dodatnih ograničenja.
Autor | Tekst i test primeri | Analiza rеšenja | Testiranje |
---|---|---|---|
Dušan Zdravković | Dušan Zdravković | Aleksandar Višnjić | Nikola Stojiljković |
Prvi podzadatak:
Potrebno je prebrojati broj oštrouglih trouglova sa temenima u datim tačkama. To je moguće uraditi grubom silom: za svake tri tačke odredimo dužine stranica \(a\), \(b\) i \(c\). Trougao je oštrougli ako važi \(a^2+b^2>c^2\), \(b^2+c^2>a^2\) i \(c^2+a^2>b^2\). Vremenska složenost je \(O(N^3)\).
Drugi podzadatak:
Pokušajmo da prebrojimo sve tupougle, pravougle i degenerisane trouglove. Fiksirajmo neku duž \(AB\). Posmatrajmo normale na tu duž u tačkama \(A\) i \(B\). Sve tačke koje se ne nalaze strogo između njih spadaju u jednu od tri kategorije koju želimo prebrojati. Kada za svaku fiksiranu duž prebrojimo traženo, dobićemo dvostruku traženu vrednost pošto smo svaki takav trougao prebrojali dvaput (po jednom za svaku "manju" stranicu kojih ima dve). Nakon što nađemo tu vrednost, znamo i broj oštrouglih trouglova.
Preostalo je odrediti koliko se tačaka nalazi između dve paralelne prave, odnosno, za svaku takvu pravu odrediti koliko se tačaka nalazi sa njene "leve" strane (nakon što se prava usmeri i tada je moguće izvršiti orijentaciju trouglova). Ovo radi pošto je razlika tih rezultata upravo broj tačaka između dve paralelne prave.
Fiksirajmo sad jednu tačku i sortirajmo ostale po uglu u odnosu na nju. Primetimo da ako fiksiramo duži sa krajem u toj tački i drugim krajem redom po ostalim dobijamo to da naše normale na duž u toj našoj centralnoj tački budu sortirane po uglu. To znači da možemo preko dva pokazivača za svaku normalu izbrojati koliko tačaka ima "levo" od nje.
Vremenska složenost je \(O(N^2\cdot logN)\).
06_trouglovi.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 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 |
|