3282 – Transform1

From Bitnami MediaWiki
Revision as of 21:37, 3 January 2024 by Corjuc Eunice (talk | contribs) (Pagină nouă: Fie un șir <code>a = a1</code>, <code>a2</code>, …, <code>aN</code> de numere naturale, nu neapărat distincte, cuprinse între <code>1</code> și <code>N</code>. Fie de asemenea două numere naturale <code>x</code> și <code>y</code>. Se definește operația <code>transform(i)</code> astfel: se determină valoarea <code>w = 1 + (x * i + y * ai) mod N</code>, apoi toate elementele egale cu <code>ai</code> din secvența <code>ai</code>, <code>ai+1</code>, …, <code>aN</cod...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Fie un șir a = a1, a2, …, aN de numere naturale, nu neapărat distincte, cuprinse între 1 și N. Fie de asemenea două numere naturale x și y. Se definește operația transform(i) astfel: se determină valoarea w = 1 + (x * i + y * ai) mod N, apoi toate elementele egale cu ai din secvența ai, ai+1, …, aN își modifică valoarea în w. De exemplu, pentru șirul a=1, 7, 1, 7, 3, 4, 7, x = 4, y = 5, operația transform(4) înseamnă că w = 1+(4*4+5*7) mod 7 = 3, deci șirul devine 1, 7, 1, 3, 3, 4, 3 (toate elementele de la poziția 4 la 7 și egale cu 7 s-au modificat în 3). După fiecare operație de tip transform se calculează suma elementelor șirului obținut.

Cerința[edit | edit source]

Să se determine suma maximă care s-a obținut în șirul a efectuând pe rând asupra șirului operațiile transform(1), transform(2), …, transform(N).

Date de intrare[edit | edit source]

Fișierul de intrare input.txt conține pe prima linie numerele naturale N, x și y. Pe linia a doua se găsesc, separate prin spațiu, elementele șirului a.

Date de ieșire[edit | edit source]

Fișierul de ieșire output.txt va conține pe prima linie un singur număr natural reprezentând suma maximă obținută.

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

  • 3 ≤ N ≤ 256.000
  • 1 ≤ x, y ≤ N

Exemplul 1[edit | edit source]

input.txt:

7 4 5

1 7 1 7 3 4 7

ouput.txt:

35

Explicație:

După transform(1), în care w = 3, șirul devine 3, 7, 3, 7, 3, 4, 7 care are suma 34.

După transform(2), în care w = 2, șirul devine 3, 2, 3, 2, 3, 4, 2 care are suma 19.

După transform(3), în care w = 7, șirul devine 3, 2, 7, 2, 7, 4, 2 care are suma 27.

După transform(4), în care w = 6, șirul devine 3, 2, 7, 6, 7, 4, 6 care are suma 35.

După transform(5), în care w = 7, șirul devine 3, 2, 7, 6, 7, 4, 6 care are suma 35.

După transform(6), în care w = 3, șirul devine 3, 2, 7, 6, 7, 3, 6 care are suma 34.

După transform(7), în care w = 3, șirul devine 3, 2, 7, 6, 7, 3, 3 care are suma 31.

Suma maximă care s-a obținut este 35.

Exemplul 2[edit | edit source]

input.txt:

999999999 4 5

1 7 1 7 3 4 7

Output:

Invalid input. Please make sure 3 ≤ N ≤ 256000 and 1 ≤ x, y ≤ N.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> N = 260001

def validate_input(n, x, y):

   if 3 <= n <= 256000 and 1 <= x <= n and 1 <= y <= n:
       return True
   return False

def main():

   with open("input.txt", "r") as input_file, open("output.txt", "w") as output_file:
       n, x, y = map(int, input_file.readline().split())
       a = list(map(int, input_file.readline().split()))
       if not validate_input(n, x, y):
           print("Invalid input. Please make sure 3 ≤ N ≤ 256000 and 1 ≤ x, y ≤ N.")
           return
       S = 0
       Rad = [0] * N
       Val = [0] * N
       tata = [0] * N
       Card = [0] * N
       for i in range(1, n + 1):
           S += a[i - 1]
       for i in range(n, 0, -1):
           if not Rad[a[i - 1]]:
               Rad[a[i - 1]] = i
               Val[i] = a[i - 1]
           tata[i] = Rad[a[i - 1]]
           Card[a[i - 1]] += 1
       Sol = 0
       for i in range(1, n + 1):
           nod = i
           while nod != tata[nod]:
               nod = tata[nod]
           val1 = Val[nod]
           val2 = 1 + (i * x + val1 * y) % n
           rad2 = Rad[val2]
           if val1 == val2:
               Card[val1] -= 1
               if Card[val1] == 0:
                   Val[nod] = 0
                   Rad[val1] = 0
           else:
               S = S + Card[val1] * (val2 - val1)
               Card[val2] = Card[val2] + Card[val1] - 1
               Card[val1] = 0
               if nod < rad2:
                   tata[nod] = rad2
                   Rad[val2] = rad2
                   Val[rad2] = val2
                   Rad[val1] = 0
                   Val[nod] = 0
               else:
                   tata[rad2] = nod
                   Rad[val2] = nod
                   Val[nod] = val2
                   Rad[val1] = 0
                   Val[rad2] = 0
           tata[i] = 0
           Sol = max(Sol, S)
       output_file.write(str(Sol))

if __name__ == "__main__":

   main()

</syntaxhighlight>