1071 - OZN

From Bitnami MediaWiki

O invazie de N farfurii zburătoare (denumite uzual OZN) dă bătăi de cap autorităţilor. În fiecare astfel de OZN se află extratereştri care au ca misiune distrugerea planetei noastre. Radarul care a detectat invazia are un ecran similar cu planul XOY. Fiecare OZN este reprezentat pe ecran printr-un segment de dreaptă.

Pentru anihilarea OZN-urilor, autorităţile dispun de K arme laser. Armele sunt poziţionate pe sol (ilustrat pe ecranul radarului prin axa OX). Fiecare armă emite o rază laser, ilustrată pe ecran printr-o paralelă cu axa OY. Dacă o rază laser intersectează segmentul de pe ecranul radarului corespunzător unui OZN, raza va omorî toţi extratereştrii aflaţi în OZN-ul respectiv.

Din păcate, în preajmă se află doar un militar specializat în arme laser, aşa că autorităţile doresc să ştie exact ce armă trebuie să folosească acesta pentru a distruge cât mai mulţi extratereştri.

Cerinţă[edit | edit source]

Ajutaţi autorităţile să determine numărul de extratereştri care pot fi anihilaţi cu fiecare armă din dotare.

Date de intrare[edit | edit source]

Fișierul de intrare ozn.in conține pe prima linie două numere naturale separate prin spaţiu N K reprezentând numărul de OZN-uri şi respectiv numărul de arme laser. Pe următoarele N linii sunt descrise cele N OZN-uri, câte unul pe linie. Un OZN este descris prin 5 numere naturale separate prin câte un spaţiu x1 y1 x2 y2 nr, reprezentând în ordine coordonatele capetelor segmentului corespunzător (x1, y1), (x2, y2), iar nr – numărul de extratereştri din el. Pe ultima linie se găsesc K numere naturale a1 a2 a3aK, separate prin câte un spaţiu, reprezentând coordonatele pe axa OX (abscisele) unde sunt amplasate armele laser.

Date de ieșire[edit | edit source]

Fișierul de ieșire ozn.out va conține K linii. Pe linia i va fi scris numărul total de extratereştri care pot fi distruşi cu arma i, considerând armele numerotate în ordinea în care acestea apar în fişierul de intrare.

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

  • 1 ≤ N ≤ 20 000
  • 1 ≤ K ≤ 20 000
  • 1 ≤ orice coordonată din fişierul de intrare ≤ 2 000 000
  • 1 ≤ nr ≤ 100, pentru orice OZN
  • x1 < x2, pentru orice OZN
  • Pe ecranul radarului segmentele ce descriu navele se pot intersecta.
  • Dacă raza laser trece prin unul dintre capetele unui OZN atunci acesta este distrus.
  • Pentru 50% dintre testele de intrare 1 ≤ N*K ≤ 10 000 000

Exemplu:[edit | edit source]

ozn.in

5 3
1 1 3 2 2
2 3 4 1 3
6 5 8 5 8
5 1 7 1 6
6 2 7 4 1
3 7 5

ozn.out

5
15
6

Explicație

Arma care emite din punctul (3,0) doboară farfuriile reprezentate de segmentele {(1,1)(3,2)} şi {(2,3)(4,1)} distrugând în total 5 extratereştri.

Arma care emite din punctul (7,0) doboară farfuriile reprezentate de segmentele {(5,1)(7,1)}, {(6,2)(7,4)} şi {(6,5)(8,5)} distrugând în total 15 extratereştri.

Arma care emite din punctul (5,0) doboară farfuria reprezentată de segmentul {(5,1)(7,1)} şi distruge 6 extratereştri.

Încărcare soluție[edit | edit source]

Lipește codul aici[edit | edit source]

<syntaxhighlight lang="python" line="1"> import sys

MAXX = 2000010 MAXN = 100010

f = open("ozn.in", "r") g = open("ozn.out", "w")

A = [0] * MAXX N, K = map(int, f.readline().split()) X1, Y1, X2, Y2, nr, i = 0, 0, 0, 0, 0, 0

for i in range(1, N + 1):

   X1, Y1, X2, Y2, nr = map(int, f.readline().split())
   A[X1] += nr
   A[X2 + 1] -= nr

for i in range(1, MAXX):

   A[i] += A[i - 1]

for i in range(1, K + 1):

   X1 = int(f.readline())
   g.write(str(A[X1]) + '\n')

g.close() f.close() </syntaxhighlight>