View difference between Paste ID: 3reApeGf and qDdzescq
SHOW: | | - or go back to the newest paste.
1
Algorytm opiera się na obserwacji, że jeśli liczba x pojawiła się na wejsciu więcej, niż raz, to my jesteśmy zainteresowani jej ostatnim wystąpieniem. Dla przykładu:
2
7 5 8 9 5 4 4
3
Liczba 4 pojawiła się dwa razy, ale jej drugie wystąpienie jest dalej od każdej poprzedniej liczby, więc jej pierwsze wystąpienie nas nie interesuje.
4
5-
1) w tablicy A trzymamy pierwsze wystąpienie liczby z indeksu, tzn A[i] mówi nam o pierwszym wystąpieniu budynku o wysokosci i
5+
1) w tablicy A trzymamy pierwsze wystąpienie liczby z indeksu, tzn A[i] mówi nam o pierwszym wystąpieniu liczby o wartosci i
6
7
2) w tablicy B trzymamy ostatnie wystąpienie
8
3) sumujemy tablice B[1..n] tak, żeby w czasie stalym móc odpowiedzieć na pytanie, jaki jest max w tabllicy B[x..n] dla jakiegos x < n
9-
Robimy to w ten sposób (pozmieniaj coś xd):
9+
Robimy to w ten sposób:
10
11
template <class T>
12
void array_part_max (T *Source, size_t size) { // O(n)
13
	if (size >= 2) {
14
		for (long long int it = size - 2; it >= 0; --it) {
15
			if (Source[it] < Source[it+1])
16
				Source[it] = Source[it+1];
17
		}
18
		Source[size] = Source[size-1];
19
	}
20
}
21
22
Do funkcji przekazujemy tablice B. Funkcja ta w B[x] zapisze max B[x..n]
23
24-
4) Szukamy max z {B[i+1] - A[i] : 0 < i < maksymalna wysokosc budynku && budynek o wysokosci i występuje na wejsciu}
24+
4) Szukamy max z {B[i+1] - A[i] : 0 < i < maksymalna wprowadzona liczba && liczba i występuje na wejsciu}
25
5) Odpowiedzią jest para (A[i], B[i+1])
26
27
Przykład:
28
in: 6 4 5 1 3 1
29
A: -1 3 -1 4 1 2 0 (A[x] = -1 <=> x nie występuje na wejsciu)
30
B: -1 5 -1 4 1 2 0
31
B: 5 5 4 4 2 2 2 (po użyciu przedstawionej funkcji)
32
Szukamy max z {B[i+1] - A[i] : i należy do {1, 3, 4, 5} }, jest nim 2 - 1 = 1 dla i = 4