Eșuând în a-și regăsi adevărata identitate, Brush se refugiază în magicul tărâm al arborilor. Arbotra o sună și îi dă următoarea problemă: se dă un arbore cu N noduri, o rădăcină fixată, și M întrebări de forma: câte perechi neordonate de noduri pot forma, luând noduri doar din subarborele nodului X (inclusiv pe X).
Cerința
Ajutați-o pe Brush să răspundă cât mai repede la intrebările lui Arbotra.
Date de intrare
Fișierul de intrare arbrush.in va conține pe prima linie trei numere naturale, numărul N, M și Root, separate de un spațiu. Următoarele N-1 linii vor conține două numere naturale a și b (între 1 și N), separate de un spațiu, cu semnificația că există muchie între nodurile a și b. Ultima linie a fișierului de intrare (linia N+1) va conține M numere separate de căte un spațiu, acestea vor semnifica cele M întrebari cerute de Arbotra.
Date de ieșire
Fișierul de ieșire arbrush.out va conține M linii, aflându-se răspunsul la fiecare întrebare cerută (în ordinea cerută în fișierul de intrare).
Restricții și precizări
2 ≤ N, M ≤ 270401 ≤ Root ≤ N- Uituc de fel, Arbotra poate pune aceeași întrebare de mai multe ori.
Exemplu
arbrush.in
8 4 1 1 2 2 3 2 5 5 6 6 7 6 8 1 4 6 4 5 2
arbrush.out
3 0 6 15
Explicație
Pentru prima întrebare, răspunsul este 3, deoarece în subarborele nodului 6 există 3 noduri: 6, 7, 8, cu care pot forma perechile {6, 7}, {7, 8}, {6, 8}
Pentru a doua întrebare răspunsul este 0, deoarece subarborele lui 4 are doar un nod, pe el înșusi și nu se pot forma perechi de câte două noduri.
Pentru a treia întrebare răspunsul este 6, deoarece în subarborele nodului 5 există 4 noduri: 5, 6, 7, 8, perechile formate sunt {6, 8}, {5, 6}, {7, 8}, {5, 8}, {5, 7}, {6, 7}
Pentru a patra întrebare răspunsul este 15.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema Arbrush:
/*
solutie oficiala - Potra Vlad
complexitate : O(N+M)
*/
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int Nmax = 27040 + 1;
const int Mmax = 27040 + 1;
ifstream is ("arbrush.in");
ofstream os ("arbrush.out");
int N, M;
int D[Nmax]; // D[x] = marimea subarborelui lui x
int Root;
vector <int> Tree[Nmax];
bool Viz[Nmax];
void DFS(int x);
int main()
{
is >> N >> M >> Root;
for (int i = 1, a, b; i < N; ++i)
{
is >> a >> b;
Tree[a].push_back(b);
Tree[b].push_back(a);
}
DFS(Root);
for (int i = 1, x; i <= M; ++i)
{
is >> x;
os << (D[x] * (D[x]-1)) / 2 << '\n';
}
is.close();
os.close();
};
void DFS(int x)
{
Viz[x] = 1;
D[x] = 1;
for (const auto& y : Tree[x])
if (Viz[y] == 0)
{
DFS(y);
D[x] += D[y];
}
};
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa
.
Rezolvarea problemei #1666 Arbrush
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1666 Arbrush de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!