1102 - Bile 2
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>