1057 - Max P: Difference between revisions

From Bitnami MediaWiki
Raul (talk | contribs)
Pagină nouă: Considerăm un şir de numere <code>a<sub>1</sub></code>, <code>a<sub>2</sub></code>, …, <code>a<sub>N</sub></code>. O secvenţă nevidă în acest şir este de forma <code>a<sub>i</sub></code>, <code>a<sub>i+1</sub></code>, …, <code>a<sub>j</sub></code>, unde <code>i ≤ j</code>. De exemplu, pentru <code>N=4</code> şi şirul <code>2 3 4 3</code>, secvenţele nevide sunt: <code>2</code>, <code>2 3</code>, <code>2 3 4</code>, <code>2 3 4 3</code>, <code>3</code>, <code>...
Tag: visualeditor
 
Raul (talk | contribs)
No edit summary
Tag: visualeditor
 
Line 46: Line 46:


=== Lipește codul aici ===
=== Lipește codul aici ===
<syntaxhighlight lang="python">
<syntaxhighlight lang="python2">
import sys
import sys



Latest revision as of 17:00, 16 February 2024

Considerăm un şir de numere a1, a2, …, aN. O secvenţă nevidă în acest şir este de forma ai, ai+1, …, aj, unde i ≤ j. De exemplu, pentru N=4 şi şirul 2 3 4 3, secvenţele nevide sunt: 2, 2 3, 2 3 4, 2 3 4 3, 3, 3 4, 3 4 3, 4, 4 3, 3. Definim puterea unui element ai ca fiind numărul de secvenţe care-l conţin pe ai şi în care ai este strict mai mare decât celelalte elemente ale fiecăreia dintre respectivele secvenţe. Astfel în şirul 2 3 4 3 puterea elementului a1 este 1 (fiind maxim doar în secvenţa formată din el însuşi), a elementului a2 este 2 (a2 fiind maxim în secvenţele 2 3 şi 3), a elementului a3 este 6 (fiind maxim în secvenţele 2 3 4, 2 3 4 3, 3 4, 3 4 3, 4 şi 4 3), iar a elementului a4 este 1.

Cerinţe[edit]

Scrieţi un program care determină puterea cea mai mare a unui element din şirul dat, precum şi numărul de elemente din şir care au cea mai mare putere.

Date de intrare[edit]

Fișierul de intrare maxp.in conține pe prima linie numărul natural N, iar pe a doua linie, în ordine, numerele naturale a1, a2, …, aN separate prin câte un spaţiu.

Date de ieșire[edit]

Fișierul de ieșire maxp.out va conține pe prima linie un număr natural ce reprezintă puterea cea mai mare a unui element din şirul dat şi pe a doua linie va conţine un număr natural ce reprezintă numărul de elemente din şir care au cea mai mare putere.

Restricții și precizări[edit]

  • 2 <= N <= 200.000
  • Elementele şirului sunt numere naturale şi au cel mult 6 cifre

Exemplul 1[edit]

maxp.in

7
9 3 4 5 1 2 2

maxp.out

12 
1

Explicație[edit]

Elementul 5 de pe poziţia 4 este maxim în 12 secvenţe:

3 4 5, 3 4 5 1, 3 4 5 1 2, 3 4 5 1 2 2, 4 5,

4 5 1, 4 5 1 2, 4 5 1 2 2, 5, 5 1, 5 1 2,

5 1 2 2, deci puterea lui este 12. Este singurul element care are această putere, celelalte elemente având puteri mai mici.

Exemplul 2[edit]

maxp.in

6
1 0 7 7 2 6

maxp.out

3 
2

Explicație[edit]

Elementele din poziţiile 3 şi 4 sunt maxime în 3 secvenţe, deci puterea lor este 3. Celelalte elemente au puteri mai mici.

Încărcare soluție[edit]

Lipește codul aici[edit]

<syntaxhighlight lang="python2"> import sys

inFile = "maxp.intxt" outFile = "maxp.outtxt" dim = 200001

a = [0] * dim st = [0] * dim dr = [0] * dim q = [0] * dim poz = [0] * dim n = 0

def main():

   global n
   i, k, x, nrsol, p, pmax = 0, 0, 0, 0, 0, 0
   
   #citire
   with open(inFile, 'r') as fin:
       n = int(fin.readline())
       for i in range(1, n+1):
           a[i] = int(fin.readline())
   
   # constructie st
   k = 0
   q[k] = dim + 2
   poz[k] = 0
   st[k] = 0
   for i in range(1, n+1):
       x = a[i]
       while q[k] < x:
           k -= 1
       st[i] = i - poz[k] - 1
       k += 1
       q[k] = x
       poz[k] = i
   
   # constructie dr
   k = 0
   q[k] = dim + 2
   poz[k] = n + 1
   dr[k] = 0
   for i in range(n, 0, -1):
       x = a[i]
       while q[k] < x:
           k -= 1
       dr[i] = poz[k] - i - 1
       k += 1
       q[k] = x
       poz[k] = i
   # calcul
   nrsol = 1
   pmax = (st[1] + 1)
   pmax *= (dr[1] + 1)
   for i in range(2, n+1):
       p = (st[i] + 1)
       p = (p * (dr[i] + 1))
       if p > pmax:
           pmax = p
           nrsol = 1
       elif p == pmax:
           nrsol += 1
   
   with open(outFile, 'w') as fout:
       fout.write(str(pmax) + "\n" + str(nrsol) + "\n")

if __name__ == "__main__":

   main()

</syntaxhighlight>