3831 - Medians
Cerința[edit | edit source]
Se dă un vector cu n
elemente. Să se determine numărul de secvențe care au medianul valorilor egal cu k
.
Date de intrare[edit | edit source]
Fișierul de intrare input.txt
contine pe prima linie un număr N
reprezentând numărul de elemente din vector și un număr k
cu semnificația din enunț. Pe a doua linie se află N
elemente , elementele vectorului.
Date de ieșire[edit | edit source]
Fișierul de ieșire output.txt
contine pe prima linie răspunsul.
Restricții și precizări[edit | edit source]
N ≤ 100.000
,K ≤ 1.000.000.000
Exemplul 1[edit | edit source]
input.txt:
2 2
1 2
output.txt:
1
Exemplul 2[edit | edit source]
input.txt:
3 5
5 1 5
output.txt:
3
Exemplul 3[edit | edit source]
input.txt:
3 99999999999
5 1 5
Output:
Invalid input constraints.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> MOD = 666013 Nmax = 100001 Add = 100000
def verify_constraints(n, k):
if not (1 <= n <= 100000 and 1 <= k <= 1000000000): print("Invalid input constraints.") exit()
def Update(pos, val):
global aib i = pos while i < Nmax * 2: aib[i] += val i += i & -i
def Query(pos):
global aib i = pos sum_ = 0 while i > 0: sum_ += aib[i] i -= i & -i return sum_
def Fx(k):
global n, V, aib
aib = [0] * (Nmax * 2)
S = [0] * (n + 1)
for i in range(1, n + 1): if V[i] > k: S[i] = -1 else: S[i] = 1
for i in range(2, n + 1): S[i] += S[i - 1]
for i in range(1, n + 1): Update(S[i] + Add, 1)
s = 0
for i in range(1, n + 1): s += Query(S[i] + Add - 1)
if S[i] < 0: s += 1
Update(S[i] + Add, -1)
return s
with open("input.txt", "r") as fin, open("output.txt", "w") as fout:
n, k = map(int, fin.readline().split()) verify_constraints(n,k) V = [0] + list(map(int, fin.readline().split()))
sk = Fx(k) skk = Fx(k - 1)
fout.write(str(abs(sk - skk)))
</syntaxhighlight>