-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathdescomp_desc.py
68 lines (48 loc) · 1.91 KB
/
descomp_desc.py
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
"""
a) Demonstrație de corectitudine:
1. Algoritmul greedy produce soluții
2. Soluția greedy este optimă
1. La fiecare pas inserez într-un subșir astfel încât acela rămâne descrescător,
sau creez un nou subșir dacă nu găsesc
2. Presupun că soluția greedy diferă de soluția optimă.
Să zicem că soluția greedy reține subșirurile pe care le construiește
de la stânga la dreapta, ordonate după ultimul element din subșir.
Fie x_i primul element care diferă.
Soluția greedy l-a inserat pe „cel mai din stânga” subșir posibil
(adică în primul subșir care avea capătul mai mare sau egal cu x_i).
Soluția optimă trebuie să îl insereze într-un subșir „mai la dreapta”
(adică într-un subșir în care avea voie să fie pus).
Dar noi putem interschimba ce numere au venit în soluția optimă după x_i
cu ce numere au venit în soluția greedy. Și astfel am obține o soluție
mai bună decât cea optimă.
"""
from bisect import bisect
import heapq
lines = (line.strip() for line in open('descomp_desc.txt'))
n = int(next(lines))
nums = map(int, next(lines).split())
subintervals = []
tails = []
# Parcurg fiecare număr o singură dată - O(n)
for value in nums:
# print('Now processing', value)
# Găsesc punctul de inserție prin căutare binară - O(log n),
# deoarece pot fi maxim `n` subșiruri.
idx = bisect(tails, value)
# print('Inserting at', idx)
if idx == len(subintervals):
subintervals.append([value])
tails.append(value)
elif tails[idx] >= value:
subintervals[idx].append(value)
tails[idx] = value
print(*subintervals, sep='\n')
heap = [(stack.pop(), idx) for idx, stack in enumerate(subintervals)]
heapq.heapify(heap)
sorted_vec = []
while heap:
value, idx = heapq.heappop(heap)
sorted_vec.append(value)
if subintervals[idx]:
heapq.heappush(heap, (subintervals[idx].pop(), idx))
print(*sorted_vec)