3282 – Transform1

De la Universitas MediaWiki

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

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

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

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

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

Exemplul 1

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

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

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()