0144 - copii: Difference between revisions
Pagină nouă: == Enunt == În Bistriţa sunt N copii, fiecare dintre ei având un număr preferat Xi . Copii se aşează pe un rând, cu poziţiile numerotate de la 1 la N. După ce copii s-au aşezat, profesoara de educaţie fizică le cere să execute M mişcări de tipul (a, b), cu semnificaţia că îşi vor schimba ordinea copiii care se află între poziţiile a şi b, inclusiv. == Cerinta == Să se răspundă la Q întrebări de tipul p, cu semnificaţia: care este numărul prefe... |
No edit summary |
||
Line 1: | Line 1: | ||
== Enunt == | == Enunt == | ||
În Bistriţa sunt N copii, fiecare dintre ei având un număr preferat Xi . Copii se aşează pe un rând, cu poziţiile numerotate de la 1 la N. După ce copii s-au aşezat, profesoara de educaţie fizică le cere să execute M mişcări de tipul (a, b), cu semnificaţia că îşi vor schimba ordinea copiii care se află între poziţiile a şi b, inclusiv. | În Bistriţa sunt <code>N</code> copii, fiecare dintre ei având un număr preferat <code>Xi</code> . Copii se aşează pe un rând, cu poziţiile numerotate de la <code>1</code> la <code>N</code>. După ce copii s-au aşezat, profesoara de educaţie fizică le cere să execute <code>M</code> mişcări de tipul <code>(a, b)</code>, cu semnificaţia că îşi vor schimba ordinea copiii care se află între poziţiile <code>a</code> şi <code>b</code>, inclusiv. | ||
== | = Cerință = | ||
Să se răspundă la <code>Q</code> întrebări de tipul <code>p</code>, cu semnificaţia: care este numărul preferat al copilului, care se află pe poziţia <code>p</code>, după executarea mişcărilor cerute de profesoara de educaţie fizică. | |||
= Date de intrare = | |||
Fișierul <code>copiiIN.txt</code> are pe prima linie un număr natural <code>N</code>. Pe linia a 2-a sunt <code>N</code> numere <code>Xi</code> , separate prin câte un spațiu, cu semnificaţia din enunţ. Pe linia a 3-a este numărul <code>M</code>. Pe următoarele <code>M</code> linii se găseșc câte un două numere <code>a</code> şi <code>b</code> cu semnificația de mai sus. Pe următoarea linie se află numărul <code>Q</code>. Pe următoarele linii se află câte un număr <code>p</code>, cu semnificaţia de mai sus. | |||
== | = Date de ieșire = | ||
Fișierul <code>copiiOUt.txt</code> va conține <code>Q</code> linii. Pe fiecare linie se va afla răspunsul la întrebarea respectivă din fişierul de intrare. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse". | |||
= Restricții = | |||
* <code>1 ≤ N ≤ 100.000</code> | |||
* <code>1 ≤ M ≤ 10.000</code> | |||
* <code>1 ≤ Q ≤ 100</code> | |||
* <code>1 ≤ a ≤ b ≤ N</code> | |||
* <code>-2.000.000.000 ≤ Xi</code> <code>≤ 2.000.000.000</code> | |||
= Exemplul 1: = | |||
<code>copiiIN.txt</code> | |||
10 | |||
1 2 3 4 5 6 7 8 9 10 | |||
2 | |||
2 5 | |||
4 8 | |||
6 | |||
1 | |||
2 | |||
4 | |||
5 | |||
8 | |||
10 | |||
<code>copiiOUT.txt</code> | |||
1 | |||
5 | |||
8 | |||
7 | |||
3 | |||
10 | |||
== | == Explicaţie == | ||
După prima mişcare şirul format din numerele preferate ale copiilor devine: <code>1 5 4 3 2 6 7 8 9 10</code>. | |||
== Exemplul 2: == | |||
<code>copiiIN.txt</code> | |||
100001 | |||
1 2 3 4 5 6 7 8 9 10 | |||
2 | |||
2 5 | |||
4 8 | |||
6 | |||
1 | |||
2 | |||
4 | |||
5 | |||
8 | |||
10 | |||
<code>copiiOUT.txt</code> | |||
Datele nu corespund restrictiilor impuse | |||
== | == Rezolvare == | ||
<syntaxhighlight lang="python3" line="1"> | |||
def verificare_restrictii(N, M, Q, updates): | |||
: | if not (1 <= N <= 100000 and 1 <= M <= 10000 and 1 <= Q <= 100): | ||
return False | |||
for x, y in updates: | |||
if not (-2000000000 <= x <= 2000000000 and -2000000000 <= y <= 2000000000 and 1 <= x <= y <= N): | |||
return False | |||
return True | |||
: | |||
: | |||
== | |||
: | |||
: | def main(): | ||
with open("copiiIN.txt", "r") as fin, open("copiiOUT.txt", "w") as fout: | |||
n = int(fin.readline().strip()) | |||
a = [0] + list(map(int, fin.readline().split())) | |||
m = int(fin.readline().strip()) | |||
updates = [tuple(map(int, fin.readline().split())) for _ in range(m)] | |||
= | |||
q = int(fin.readline().strip()) | |||
if not verificare_restrictii(n, m, q, updates): | |||
fout.write("Datele nu corespund restrictiilor impuse\n") | |||
return | |||
for _ in range(q): | |||
p = int(fin.readline().strip()) | |||
for j in range(m - 1, -1, -1): | |||
x, y = updates[j] | |||
if x <= p <= y: | |||
p = x + y - p | |||
fout.write(str(a[p]) + "\n") | |||
if __name__ == "__main__": | |||
main() | |||
</syntaxhighlight> | </syntaxhighlight> |
Latest revision as of 20:23, 22 February 2024
Enunt[edit | edit source]
În Bistriţa sunt N
copii, fiecare dintre ei având un număr preferat Xi
. Copii se aşează pe un rând, cu poziţiile numerotate de la 1
la N
. După ce copii s-au aşezat, profesoara de educaţie fizică le cere să execute M
mişcări de tipul (a, b)
, cu semnificaţia că îşi vor schimba ordinea copiii care se află între poziţiile a
şi b
, inclusiv.
Cerință[edit | edit source]
Să se răspundă la Q
întrebări de tipul p
, cu semnificaţia: care este numărul preferat al copilului, care se află pe poziţia p
, după executarea mişcărilor cerute de profesoara de educaţie fizică.
Date de intrare[edit | edit source]
Fișierul copiiIN.txt
are pe prima linie un număr natural N
. Pe linia a 2-a sunt N
numere Xi
, separate prin câte un spațiu, cu semnificaţia din enunţ. Pe linia a 3-a este numărul M
. Pe următoarele M
linii se găseșc câte un două numere a
şi b
cu semnificația de mai sus. Pe următoarea linie se află numărul Q
. Pe următoarele linii se află câte un număr p
, cu semnificaţia de mai sus.
Date de ieșire[edit | edit source]
Fișierul copiiOUt.txt
va conține Q
linii. Pe fiecare linie se va afla răspunsul la întrebarea respectivă din fişierul de intrare. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".
Restricții[edit | edit source]
1 ≤ N ≤ 100.000
1 ≤ M ≤ 10.000
1 ≤ Q ≤ 100
1 ≤ a ≤ b ≤ N
-2.000.000.000 ≤ Xi
≤ 2.000.000.000
Exemplul 1:[edit | edit source]
copiiIN.txt
10 1 2 3 4 5 6 7 8 9 10 2 2 5 4 8 6 1 2 4 5 8 10
copiiOUT.txt
1 5 8 7 3 10
Explicaţie[edit | edit source]
După prima mişcare şirul format din numerele preferate ale copiilor devine: 1 5 4 3 2 6 7 8 9 10
.
Exemplul 2:[edit | edit source]
copiiIN.txt
100001 1 2 3 4 5 6 7 8 9 10 2 2 5 4 8 6 1 2 4 5 8 10
copiiOUT.txt
Datele nu corespund restrictiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> def verificare_restrictii(N, M, Q, updates):
if not (1 <= N <= 100000 and 1 <= M <= 10000 and 1 <= Q <= 100): return False for x, y in updates: if not (-2000000000 <= x <= 2000000000 and -2000000000 <= y <= 2000000000 and 1 <= x <= y <= N): return False return True
def main():
with open("copiiIN.txt", "r") as fin, open("copiiOUT.txt", "w") as fout: n = int(fin.readline().strip()) a = [0] + list(map(int, fin.readline().split()))
m = int(fin.readline().strip()) updates = [tuple(map(int, fin.readline().split())) for _ in range(m)]
q = int(fin.readline().strip())
if not verificare_restrictii(n, m, q, updates): fout.write("Datele nu corespund restrictiilor impuse\n") return
for _ in range(q): p = int(fin.readline().strip()) for j in range(m - 1, -1, -1): x, y = updates[j] if x <= p <= y: p = x + y - p fout.write(str(a[p]) + "\n")
if __name__ == "__main__":
main()
</syntaxhighlight>