fbpx

Problema #1666 – Arbrush – Rezolvari PBInfo

de Mihai-Alexandru

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 ≤ 27040
  • 1 ≤ 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.

#include <bits/stdc++.h>


using namespace std;

ifstream cin("arbrush.in");
ofstream cout("arbrush.out");

vector <int> G[30001];
int n ,m  , p , x , y , k , P[30001] , d[30001] , r;

int dfs(int x)
{
    P[x] = 1;
    d[x] = 1;
    for(auto i:G[x])
        if(!P[i]) d[x] += dfs(i);
    return d[x];

}

int main()
{
    cin >> n >> m >> r;
    for(int i = 1 ; i < n ; i++)
    {
        cin >> x >> y;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    d[r] = dfs(r);
    for(int i = 1 ; i <= m ; i++)
    {
        cin >> x;
        cout << d[x] * (d[x] - 1) / 2 << '\n';
    }
}
Comentarii

S-ar putea sa iti placa