<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=3540_-_Ambuscada</id>
	<title>3540 - Ambuscada - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=3540_-_Ambuscada"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3540_-_Ambuscada&amp;action=history"/>
	<updated>2026-05-01T03:41:27Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3540_-_Ambuscada&amp;diff=9748&amp;oldid=prev</id>
		<title>Cristina94: Pagină nouă: ==Cerința== N soldați, numerotați de la 1 la N, sunt prinși într-o ambuscadă. Asupra lor se execută M atacuri de tun. Atacurile afectează nu doar un soldat, ci un interval de soldați, provocând fiecăruia dintre aceștia o anumită pierdere (damage). De exemplu, atacul (3,7,5) afectează soldații 3,4,5,6,7 cu 5 damage. La început, toți soldații au V vieți. Câți soldați rămân în viață după cele M atacuri?  ==Date de intrare== Fișierul de intrare ambusc...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3540_-_Ambuscada&amp;diff=9748&amp;oldid=prev"/>
		<updated>2024-04-01T10:32:12Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: ==Cerința== N soldați, numerotați de la 1 la N, sunt prinși într-o ambuscadă. Asupra lor se execută M atacuri de tun. Atacurile afectează nu doar un soldat, ci un interval de soldați, provocând fiecăruia dintre aceștia o anumită pierdere (damage). De exemplu, atacul (3,7,5) afectează soldații 3,4,5,6,7 cu 5 damage. La început, toți soldații au V vieți. Câți soldați rămân în viață după cele M atacuri?  ==Date de intrare== Fișierul de intrare ambusc...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Cerința==&lt;br /&gt;
N soldați, numerotați de la 1 la N, sunt prinși într-o ambuscadă. Asupra lor se execută M atacuri de tun. Atacurile afectează nu doar un soldat, ci un interval de soldați, provocând fiecăruia dintre aceștia o anumită pierdere (damage). De exemplu, atacul (3,7,5) afectează soldații 3,4,5,6,7 cu 5 damage. La început, toți soldații au V vieți. Câți soldați rămân în viață după cele M atacuri?&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare ambuscada.in conține pe prima linie numerele naturale N, M și V separate prin spații. Pe următoarele M linii se află câte 3 numere naturale i j k separate cu un spațiu, cu semnificația de mai sus.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire ambuscada.out va conține un singur număr natural reprezentând numărul de soldați rămași în viață.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
*2 ≤ N ≤ 1.000.000.000, 1 ≤ M ≤ 100.000, 1 ≤ V ≤ 1.000.000.000&lt;br /&gt;
*In toate testele, 1 ≤ i ≤ j ≤ N, 1 ≤ k ≤ V&lt;br /&gt;
*Pentru teste în valoare de 30 de puncte, N&amp;lt;=100.000 și M&amp;lt;=50&lt;br /&gt;
&lt;br /&gt;
==Exemplul 1==&lt;br /&gt;
;ambuscada.in&lt;br /&gt;
:6 4 10&lt;br /&gt;
:2 5 2&lt;br /&gt;
:1 3 7&lt;br /&gt;
:2 6 3&lt;br /&gt;
:3 5 6&lt;br /&gt;
&lt;br /&gt;
;ambuscada.out&lt;br /&gt;
:2&lt;br /&gt;
&lt;br /&gt;
==Explicație==&lt;br /&gt;
Inițial toți soldații aveau 10 vieți.&lt;br /&gt;
După prima tragere: 10 8 8 8 8 10&lt;br /&gt;
După a doua tragere: 3 1 1 8 8 10&lt;br /&gt;
După a treia tragere: 3 0 0 5 5 7&lt;br /&gt;
După a patra tragere: 3 0 0 0 0 7&lt;br /&gt;
In final, 2 soldați au rămas în viață: primul și ultimul.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 2==&lt;br /&gt;
;ambuscada.in&lt;br /&gt;
:5 2 &lt;br /&gt;
:2 7 8&lt;br /&gt;
:1 &lt;br /&gt;
&lt;br /&gt;
;ambuscada.out&lt;br /&gt;
:Date invalide: Linia 1 nu contine suficiente valori&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
#3540 Ambuscada&lt;br /&gt;
def verificare_date_intrare(N, M, V, atacuri):&lt;br /&gt;
  # Verificăm dacă N, M și V sunt în intervalul specificat&lt;br /&gt;
  if not (2 &amp;lt;= N &amp;lt;= 1000000000 and 1 &amp;lt;= M &amp;lt;= 100000 and 1 &amp;lt;= V &amp;lt;= 1000000000):&lt;br /&gt;
    return False&lt;br /&gt;
  &lt;br /&gt;
  # Verificăm fiecare atac&lt;br /&gt;
  for atac in atacuri:&lt;br /&gt;
    i, j, k = atac&lt;br /&gt;
    # Verificăm dacă i, j și k sunt în intervalul specificat&lt;br /&gt;
    if not (1 &amp;lt;= i &amp;lt;= j &amp;lt;= N and 1 &amp;lt;= k &amp;lt;= V):&lt;br /&gt;
      return False&lt;br /&gt;
  &lt;br /&gt;
  return True&lt;br /&gt;
&lt;br /&gt;
def soldati_ramasii(N, M, V, atacuri):&lt;br /&gt;
  # Inițializăm un vector cu viețile soldaților&lt;br /&gt;
  soldati = [V] * N&lt;br /&gt;
  &lt;br /&gt;
  # Parcurgem fiecare atac și actualizăm starea soldaților afectați&lt;br /&gt;
  for atac in atacuri:&lt;br /&gt;
    i, j, k = atac&lt;br /&gt;
    for index in range(i-1, j):&lt;br /&gt;
      soldati[index] -= k&lt;br /&gt;
  &lt;br /&gt;
  # Numărăm câți soldați au vieți pozitive și returnăm rezultatul&lt;br /&gt;
  soldati_ramas = sum(1 for viata in soldati if viata &amp;gt; 0)&lt;br /&gt;
  return soldati_ramas&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  # Citim datele de intrare din fișier&lt;br /&gt;
  with open(&amp;#039;ambuscada.in&amp;#039;, &amp;#039;r&amp;#039;) as f:&lt;br /&gt;
    linii = f.readlines()&lt;br /&gt;
  &lt;br /&gt;
  # Verificăm dacă există suficiente linii în fișierul de intrare&lt;br /&gt;
  if len(linii) &amp;lt; 2:&lt;br /&gt;
    # Scriem mesaj de date invalide în fișierul de ieșire&lt;br /&gt;
    with open(&amp;#039;ambuscada.out&amp;#039;, &amp;#039;w&amp;#039;) as f:&lt;br /&gt;
      f.write(&amp;quot;Date invalide: Nu sunt suficiente date in fisierul de intrare&amp;quot;)&lt;br /&gt;
    return&lt;br /&gt;
  &lt;br /&gt;
  # Extragem N, M și V din prima linie&lt;br /&gt;
  try:&lt;br /&gt;
    N, M, V = map(int, linii[0].split())&lt;br /&gt;
  except ValueError:&lt;br /&gt;
    # Scriem mesaj de date invalide în fișierul de ieșire&lt;br /&gt;
    with open(&amp;#039;ambuscada.out&amp;#039;, &amp;#039;w&amp;#039;) as f:&lt;br /&gt;
      f.write(&amp;quot;Date invalide: Linia 1 nu contine suficiente valori&amp;quot;)&lt;br /&gt;
    return&lt;br /&gt;
  &lt;br /&gt;
  # Verificăm dacă există suficiente atacuri în fișierul de intrare&lt;br /&gt;
  if len(linii) - 1 &amp;lt; M:&lt;br /&gt;
    # Scriem mesaj de date invalide în fișierul de ieșire&lt;br /&gt;
    with open(&amp;#039;ambuscada.out&amp;#039;, &amp;#039;w&amp;#039;) as f:&lt;br /&gt;
      f.write(&amp;quot;Date invalide: Nu sunt suficiente atacuri in fisierul de intrare&amp;quot;)&lt;br /&gt;
    return&lt;br /&gt;
  &lt;br /&gt;
  # Citim atacurile&lt;br /&gt;
  atacuri = [tuple(map(int, line.split())) for line in linii[1:M+1]]&lt;br /&gt;
  &lt;br /&gt;
  # Verificăm datele de intrare&lt;br /&gt;
  if not verificare_date_intrare(N, M, V, atacuri):&lt;br /&gt;
    # Scriem mesaj de date invalide în fișierul de ieșire&lt;br /&gt;
    with open(&amp;#039;ambuscada.out&amp;#039;, &amp;#039;w&amp;#039;) as f:&lt;br /&gt;
      f.write(&amp;quot;Datele de intrare sunt invalide&amp;quot;)&lt;br /&gt;
    return&lt;br /&gt;
  &lt;br /&gt;
  # Calculăm numărul de soldați rămași în viață&lt;br /&gt;
  soldati_ramas = soldati_ramasii(N, M, V, atacuri)&lt;br /&gt;
  &lt;br /&gt;
  # Scriem rezultatul în fișierul de ieșire&lt;br /&gt;
  with open(&amp;#039;ambuscada.out&amp;#039;, &amp;#039;w&amp;#039;) as f:&lt;br /&gt;
    f.write(str(soldati_ramas))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
  main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cristina94</name></author>
	</entry>
</feed>