2725 - Aib

From Bitnami MediaWiki
Revision as of 07:42, 4 June 2024 by Danciu (talk | contribs) (Pagină nouă: Aveți la dispoziție un număr natural nenul <code>n</code> și o permutare <code>a = (a[1], a[2], ..., a[n])</code> a mulțimii <code>{1, 2, ..., n}</code>. = Cerința = Pentru fiecare număr <code>a[i]</code> trebuie să determinați câte numere mai mici decât <code>a[i]</code> se află la stânga sa, adică în secvența <code>a[1], a[2], ..., a[i-1]</code>. = Date de intrare = Programul citește de la tastatură numărul <code>n</code>, iar apoi <code>n</code> numere...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Aveți la dispoziție un număr natural nenul n și o permutare a = (a[1], a[2], ..., a[n]) a mulțimii {1, 2, ..., n}.

Cerința[edit | edit source]

Pentru fiecare număr a[i] trebuie să determinați câte numere mai mici decât a[i] se află la stânga sa, adică în secvența a[1], a[2], ..., a[i-1].

Date de intrare[edit | edit source]

Programul citește de la tastatură numărul n, iar apoi n numere naturale separate prin spații reprezentând permutarea.

Date de ieșire[edit | edit source]

Programul va afișa pe ecran pentru fiecare i=1..n câte numere mai mici decât a[i] se află la stânga sa.

Restricții și precizări[edit | edit source]

  • 3 ≤ n ≤ 100.000

Exemplu:[edit | edit source]

Intrare

7
3 1 6 5 2 7 4

Ieșire

0 0 2 2 1 5 3

Explicație[edit | edit source]

Sunt 0 numere mai mici decât 3 și aflate la stânga lui 3.

Sunt 0 numere mai mici decât 1 și aflate la stânga lui 1

Sunt 2 numere mai mici decât 6 și aflate la stânga lui 6 (acestea sunt primele două numere din șir, adică 3 și 1)

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3"> def count_smaller(arr):

   n = len(arr)
   result = [0] * n
   bit = [0] * (n + 1)
   def update(x, val):
       while x <= n:
           bit[x] += val
           x += x & -x
   def query(x):
       s = 0
       while x > 0:
           s += bit[x]
           x -= x & -x
       return s
   for i in range(n - 1, -1, -1):
       result[i] = query(arr[i])
       update(arr[i], 1)
   return result

def main():

   n = int(input("Introduceti n: "))
   arr = list(map(int, input("Introduceti permutarea: ").split()))
   smaller_counts = count_smaller(arr)
   for count in smaller_counts:
       print(count, end=" ")

if __name__ == "__main__":

   main()

</syntaxhighlight>