1102 - Bile 2

From Bitnami MediaWiki

Pe o masă cad n bile săltăreţe. Fiecare este lăsată să cadă liber de la o înălţime h, diferită pentru fiecare bilă. Toate bilele cad simultan, cu o viteză constantă (1m/s) .

În momentul în care bila i atinge masa, tendinţa ei va fi să se ridice în aer până la înălţimea h - k, după care aceasta cade din nou. De fiecare dată când o bilă atinge masa, aceasta va tinde să urce la o înlăţime cu k mai mică decât cea la care a urcat anterior. Dupa multe sărituri, bilele pot obosi şi nu vor mai sări. Când bilele sar în sus, vor urca tot cu aceeaşi viteza constantă.

Dându-se h şi k pentru fiecare dintre cele n bile, să se răspundă la m întrebări de forma: La ce înălţime faţă de masă se va afla bila x în momentul t ?

Date de intrare[edit | edit source]

Fişierul de intrare input.txt conţine pe prima linie 2 numere naturale n şi m. Pe următoarele n linii se află o pereche de numere, h şi k . Următoarele m linii vor conţine 2 numere naturale x şi t cu semnificaţiile de mai sus.

Date de ieşire[edit | edit source]

În fişierul de ieşire output.txt se vor afişa m linii, răspunsurile la cele m întrebări.

Restricţii[edit | edit source]

  • 1 ≤ n, m ≤ 100.000

Exemplul 1[edit | edit source]

input.txt:

2 3

5 1

8 2

1 4

1 7

2 16

output.txt:

1

2

4

Explicație:

Bila 1 cade de la înălţimea 5 timp de 4 secunde apoi se opreşte la înălţimea 1.

Bila 1 cade de la înălţimea 5 şi atinge pământul, iar în cele 2 secunde rămase ajunge la înălţimea 2.

Bila 2 cade de la înălţimea 8, atinge pământul şi apoi ajunge la noua sa înălţime maximă, 6, în 14 secunde. în cele 2 secunde rămase, bila apucă să coboare la înălţimea 4.

Exemplul 2[edit | edit source]

input.txt:

999999999999 3

5 1

8 2

1 4

1 7

2 16

Output:

Constraints not met!

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def verify_constraints(n, m):

   return 1 <= n <= 100000 and 1 <= m <= 100000

def main():

   with open("input.txt", "r") as fin, open("output.txt", "w") as fout:
       N = 100005
       h = [0] * N
       k = [0] * N
       n, m = map(int, fin.readline().split())
       if not verify_constraints(n, m):
           print("Constraints not met!")
           return
       for i in range(1, n + 1):
           h[i], k[i] = map(int, fin.readline().split())
       for _ in range(m):
           x, t = map(int, fin.readline().split())
           crt = h[x]
           height = h[x]
           if t <= h[x]:
               fout.write(f"{h[x] - t}\n")
               continue
           t -= h[x]
           height = 0
           crt -= k[x]
           while t and crt:
               if t <= crt:
                   height += t
                   t = 0
               else:
                   t -= crt
                   height = crt
               if not t:
                   break
               if t <= crt:
                   height -= t
                   t = 0
               else:
                   t -= crt
                   height = 0
               crt = max(0, crt - k[x])
           fout.write(f"{height}\n")

if __name__ == "__main__":

   main()

</syntaxhighlight>