<?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=1757_%E2%80%93_Sec</id>
	<title>1757 – Sec - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=1757_%E2%80%93_Sec"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1757_%E2%80%93_Sec&amp;action=history"/>
	<updated>2026-05-01T08:49:05Z</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=1757_%E2%80%93_Sec&amp;diff=10094&amp;oldid=prev</id>
		<title>Danciu: Pagină nouă: În timp ce-și bea sortimentul preferat de vin sec, vrăjitorului Arpsod i-a venit în minte o problemă de informatică ce are un enunț cel puțin la fel de sec și anume:  Dându-se un arbore binar cu &lt;code&gt;N&lt;/code&gt; noduri și rădăcina în nodul &lt;code&gt;1&lt;/code&gt;, să se răspundă la &lt;code&gt;Q&lt;/code&gt; întrebări de forma: “sunt cei doi fii ai nodului &lt;code&gt;X&lt;/code&gt; identici?”  Doi fii sunt identici dacă au același număr de subarbori și aceștia sunt identici (mai ex...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1757_%E2%80%93_Sec&amp;diff=10094&amp;oldid=prev"/>
		<updated>2024-06-04T07:08:48Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: În timp ce-și bea sortimentul preferat de vin sec, vrăjitorului Arpsod i-a venit în minte o problemă de informatică ce are un enunț cel puțin la fel de sec și anume:  Dându-se un arbore binar cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri și rădăcina în nodul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, să se răspundă la &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; întrebări de forma: “sunt cei doi fii ai nodului &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; identici?”  Doi fii sunt identici dacă au același număr de subarbori și aceștia sunt identici (mai ex...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;În timp ce-și bea sortimentul preferat de vin sec, vrăjitorului Arpsod i-a venit în minte o problemă de informatică ce are un enunț cel puțin la fel de sec și anume:&lt;br /&gt;
&lt;br /&gt;
Dându-se un arbore binar cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri și rădăcina în nodul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, să se răspundă la &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; întrebări de forma: “sunt cei doi fii ai nodului &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; identici?”&lt;br /&gt;
&lt;br /&gt;
Doi fii sunt identici dacă au același număr de subarbori și aceștia sunt identici (mai exact, pentru orice &amp;lt;code&amp;gt;i=1, 2, ..., N&amp;lt;/code&amp;gt; subarborele &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; al primului este identic cu subarborele &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; al celui de-al doilea).&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Cunoscându-se arborele, să se răspundă la cele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; întrebări de forma indicată în enunţ.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Pe prima linie a fișierului &amp;lt;code&amp;gt;sec.in&amp;lt;/code&amp;gt; se află numărul natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, reprezentând numărul de noduri ale arborelui. Următoarele &amp;lt;code&amp;gt;N-1&amp;lt;/code&amp;gt; linii conțin perechi de forma &amp;lt;code&amp;gt;( x, y )&amp;lt;/code&amp;gt; cu semnificația că există muchie între nodul &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; și nodul &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;. Pe a &amp;lt;code&amp;gt;(N+1)&amp;lt;/code&amp;gt;-a linie se va afla numărul natural &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt;, reprezentând numărul de întrebări. Pe următoarele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; linii se va afla câte un număr natural reprezentând eticheta nodului ai cărui fii vor fi analizați.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul &amp;lt;code&amp;gt;sec.out&amp;lt;/code&amp;gt; va avea &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; linii. Pe fiecare linie va fi scris cuvântul &amp;lt;code&amp;gt;DA&amp;lt;/code&amp;gt; dacă cei doi fii sunt identici respectiv &amp;lt;code&amp;gt;NU&amp;lt;/code&amp;gt; în caz contrar .&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 200.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Q ≤ 500.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Nodurile arborelui sunt etichetate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Rădăcina va fi mereu în nodul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Fii NU sunt identici dacă unul dintre ei trebuie oglindit / rotit pentru a arăta ca celălalt.&lt;br /&gt;
* În cazul în care nodul cerut nu are fii, se va afișa &amp;lt;code&amp;gt;DA&amp;lt;/code&amp;gt; (se consideră că sunt doi fii &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; identici)&lt;br /&gt;
* Se garantează că pentru &amp;lt;code&amp;gt;30%&amp;lt;/code&amp;gt; din teste &amp;lt;code&amp;gt;1 ≤ N ≤ 1000&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;1 ≤ Q ≤ 3000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;sec.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 9&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 2 4&lt;br /&gt;
 2 5&lt;br /&gt;
 3 6&lt;br /&gt;
 4 8&lt;br /&gt;
 5 9&lt;br /&gt;
 6 7&lt;br /&gt;
 4&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 3&lt;br /&gt;
 7&lt;br /&gt;
&amp;lt;code&amp;gt;sec.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 NU&lt;br /&gt;
 DA&lt;br /&gt;
 NU&lt;br /&gt;
 DA&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Nodurile 2, 7, 8, 9 au ambii fii identici. Celelalte noduri nu au aceasta proprietate&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
from collections import defaultdict, deque&lt;br /&gt;
import hashlib&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
sys.setrecursionlimit(300000)&lt;br /&gt;
&lt;br /&gt;
def read_input(file):&lt;br /&gt;
    with open(file, &amp;#039;r&amp;#039;) as f:&lt;br /&gt;
        data = f.read().split()&lt;br /&gt;
    index = 0&lt;br /&gt;
    N = int(data[index])&lt;br /&gt;
    index += 1&lt;br /&gt;
    edges = []&lt;br /&gt;
    for _ in range(N - 1):&lt;br /&gt;
        x = int(data[index])&lt;br /&gt;
        y = int(data[index + 1])&lt;br /&gt;
        index += 2&lt;br /&gt;
        edges.append((x, y))&lt;br /&gt;
    Q = int(data[index])&lt;br /&gt;
    index += 1&lt;br /&gt;
    queries = []&lt;br /&gt;
    for _ in range(Q):&lt;br /&gt;
        queries.append(int(data[index]))&lt;br /&gt;
        index += 1&lt;br /&gt;
    return N, edges, Q, queries&lt;br /&gt;
&lt;br /&gt;
def build_tree(N, edges):&lt;br /&gt;
    tree = defaultdict(list)&lt;br /&gt;
    for x, y in edges:&lt;br /&gt;
        tree[x].append(y)&lt;br /&gt;
        tree[y].append(x)&lt;br /&gt;
    return tree&lt;br /&gt;
&lt;br /&gt;
def dfs(node, parent, tree, hashes):&lt;br /&gt;
    children = []&lt;br /&gt;
    for child in tree[node]:&lt;br /&gt;
        if child != parent:&lt;br /&gt;
            children.append(dfs(child, node, tree, hashes))&lt;br /&gt;
    &lt;br /&gt;
    children.sort()&lt;br /&gt;
    subtree_hash = hashlib.sha256(&amp;#039;&amp;#039;.join(children).encode()).hexdigest()&lt;br /&gt;
    hashes[node] = subtree_hash&lt;br /&gt;
    return subtree_hash&lt;br /&gt;
&lt;br /&gt;
def solve(N, edges, Q, queries):&lt;br /&gt;
    tree = build_tree(N, edges)&lt;br /&gt;
    hashes = {}&lt;br /&gt;
    &lt;br /&gt;
    dfs(1, -1, tree, hashes)&lt;br /&gt;
    &lt;br /&gt;
    results = []&lt;br /&gt;
    for node in queries:&lt;br /&gt;
        children = [child for child in tree[node] if child != node]&lt;br /&gt;
        if len(children) &amp;lt; 2:&lt;br /&gt;
            results.append(&amp;quot;DA&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            if hashes[children[0]] == hashes[children[1]]:&lt;br /&gt;
                results.append(&amp;quot;DA&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                results.append(&amp;quot;NU&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    return results&lt;br /&gt;
&lt;br /&gt;
def write_output(file, results):&lt;br /&gt;
    with open(file, &amp;#039;w&amp;#039;) as f:&lt;br /&gt;
        for result in results:&lt;br /&gt;
            f.write(result + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    N, edges, Q, queries = read_input(&amp;#039;sec.in&amp;#039;)&lt;br /&gt;
    results = solve(N, edges, Q, queries)&lt;br /&gt;
    write_output(&amp;#039;sec.out&amp;#039;, results)&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>Danciu</name></author>
	</entry>
</feed>