3652 - secvcost

From Bitnami MediaWiki

Se dă un șir V de N numere naturale distincte. O secvență [X, Y] este formată din toate pozițiile consecutive dintre X și Y din șir. Se definește costul unei poziții P ca fiind valoarea din șir de pe poziția P înmulțită cu lungimea maximă a unei secvențe care conține poziția P și a cărei valoare maximă se află tot pe poziția P.

Cerința[edit | edit source]

Se dau M întrebări de forma: X Y – să se calculeze suma tuturor costurilor pozițiilor din secvența [X, Y]. Atenție! Când se calculează costul unei poziții P din [X, Y], secvența de lungime maximă pe care valoarea V[P] este maximă se calculează în funcție de tot șirul, NU în funcție de secvența [X, Y] (pentru clarificare urmăriți exemplul).

Date de intrare[edit | edit source]

Fișierul de intrare secvcostin.txt conține pe prima linie cele două numere N și M, separate prin spațiu. Pe a doua linie se află N numere naturale distincte reprezentând elementele șirului V. Pe următoarele M linii se află perechi de valori X, Y reprezentând întrebările la care trebuie să se răspundă.

Date de ieșire[edit | edit source]

Fișierul de ieșire secvcostout.txt va conține M linii cu câte un număr pe fiecare linie reprezentând răspunsul la cele M întrebări, în ordine.

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

  • Toate valorile din șir sunt mai mici sau egale decât 5.000.000
  • Pentru 25% din teste N, M ≤ 500
  • Pentru alte 25% din teste N, M ≤ 10.000
  • Pentru restul de 50% din teste N, M ≤ 200.000

Exemplul 1[edit | edit source]

secvcostin.txt
5 2
2 3 1 5 4
3 3
2 2
secvcostout.txt
Datele introduse corespund restricțiilor impuse.
1
9

Explicație[edit | edit source]

Pentru prima întrebare avem V[3] = 1 care este maxim pe secvența [3, 3]. Costul este 1 * 1 = 1. Pentru a doua întrebare avem V[2] = 3 care este maxim pe secvența [1, 3]. Costul este 3 * 3 = 9.

Exemplul 2[edit | edit source]

secvcostin.txt
5 3
2 3 1 5 4
1 3
5 5
4 4
secvcostout.txt
Datele introduse corespund restricțiilor impuse.
12
4
25

Explicație[edit | edit source]

2*1 + 3*3 + 1*1 = 12 4*1 = 4 5*5 = 25

Exemplul 3[edit | edit source]

secvcostin.txt
10 10
10 30 29 39 34 32 3 6 7 9
6 7
1 7
6 10
1 5
7 9
4 7
3 7
5 6
3 7
6 10
secvcostout.txt
Datele introduse corespund restricțiilor impuse.
163
886
232
723
36
757
786
364
786
232

Exemplul 4[edit | edit source]

secvcostin.txt
5 2
2 3 1 5 6000000
3 3
2 2
secvcostout.txt
Datele introduse nu corespund restricțiilor impuse.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1">

  1. 3652 - secvcost

def validare(date1): # functia de validare a datelor de intrare

   numar_elemente, numar_intrebari = map(int, date1[0].split())
   if not (1 <= numar_elemente <= 200000) or not (1 <= numar_intrebari <= 200000):
       raise ValueError
   sir = list(map(int, date1[1].split()))
   if len(sir) != numar_elemente or any(element > 5000000 for element in sir):
       raise ValueError
   intrebari = [list(map(int, date1[i].split())) for i in range(2, 2 + numar_intrebari)]
   if any(not (1 <= X <= Y <= numar_elemente) for X, Y in intrebari):
       raise ValueError
   fisier_iesire.write("Datele de intrare corespund restrictiilor impuse\n")


def cost_secventa(date1): # functia de rezolvare

   numar_elemente, numar_intrebari = map(int, date1[0].split())
   sir = list(map(int, date1[1].split()))
   intrebari = [list(map(int, date1[i].split())) for i in range(2, 2 + numar_intrebari)]
   for X, Y in intrebari:
       cost = sum([sir[i] * max(len(sir[:i+1]), len(sir[i:])) for i in range(X-1, Y)])
       fisier_iesire.write(f"{cost}\n")


if __name__ == '__main__':

   fisier_intrare = open("secvcostin.txt", "r")         # declararea fisierelor
   fisier_iesire = open("secvcostout.txt", "w")       # fisierul out trebuie declarat cu optiunea "w" (write)
   # din cauza datelor de intrare pot aparea 2 tipuri de erori, valueError sau IndexError pe care le tratam
   try:
       date = fisier_intrare.readlines()      # citirea numerelor se face ca sir de caractere
       validare(date)                 # apelul functiei de validare
       cost_secventa(date)               # apelul functiei de rezolvare
   except ValueError:
       fisier_iesire.write("Datele de intrare nu corespund restrictiilor impuse")
   except IndexError:
       fisier_iesire.write("Datele de intrare nu corespund restrictiilor impuse")

</syntaxhighlight>