아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

루트 노드가 많은 트리일수록 좋은 트리이다

시간 제한2초메모리 제한1024 MB

요약
방향 간선과 무방향 간선이 섞인 트리에서 간선 방향을 갱신할 때마다 모든 정점에 도달할 수 있는 정점의 수를 구한다.
난이도

어려움10점 중 8점

유형
트리, DFS, 구현, 그래프
정답자
아직 제출이 없습니다

문제

NN 개의 노드와 N−1N-1 개의 간선으로 이루어진 그래프가 있다. 노드는 11번부터 NN번까지 번호가 매겨져 있으며, 각 간선은 방향성을 가지고 있을 수도 있고, 무방향성일 수도 있다. 모든 간선의 방향성을 제거할 경우 이 그래프는 트리가 된다.

어떤 노드에서 다른 모든 노드로 가는 경로가 존재하는 경우 이 노드를 '루트 노드'라고 하자. 이 그래프의 '좋음'은 루트 노드의 수로 정의한다. 이 때, 다음 쿼리들을 수행하자.

  1. uu와 vv를 잇는 간선을 u→vu \rightarrow v의 방향 간선으로 바꾼다.
  2. uu와 vv를 잇는 간선을 u←vu \leftarrow v의 방향 간선으로 바꾼다.
  3. uu와 vv를 잇는 간선을 무방향 간선으로 바꾼다.

쿼리의 실행 결과는 그래프에 누적된다.

입력

첫 번째 줄에는 노드의 수 NN이 주어진다.

두 번째 줄부터 N−1N-1 개 줄에 걸쳐 간선들에 대한 정보가 주어진다. 간선의 정보는 공백으로 구분된 세 개의 토큰 UiU_i, DiD_i, ViV_i로 주어지며, UiU_i와 ViV_i는 정점 번호를 의미하는 정수이고 DiD_i는 방향을 의미하는 문자열로 ->, <-, -- 중 하나이다.

  • DiD_i가 ->라면 ii번째 간선은 Ui→ViU_i \rightarrow V_i인 방향 간선이다.
  • DiD_i가 <-라면 ii번째 간선은 Ui←ViU_i \leftarrow V_i인 방향 간선이다.
  • DiD_i가 --라면 ii번째 간선은 Ui↔ViU_i \leftrightarrow V_i인 무방향 간선이다.

다음 줄에는 수행할 쿼리의 수 QQ가 주어진다.

다음 줄부터 QQ 개의 줄의 각 줄마다 쿼리가 순서대로 주어진다. ii 번째 줄에는 세 개의 토큰 uiu_i did_i viv_i로 주어지며, uiu_i와 viv_i는 정점 번호를 의미하는 정수이고 did_i는 방향을 의미하는 문자열로 ->, <-, -- 중 하나이다.

  • did_i가 ->라면 ii번째 간선을 ui→viu_i \rightarrow v_i인 방향 간선으로 설정한다.
  • did_i가 <-라면 ii번째 간선을 ui←viu_i \leftarrow v_i인 방향 간선으로 설정한다.
  • did_i가 --라면 ii번째 간선을 ui↔viu_i \leftrightarrow v_i인 무방향 간선으로 설정한다.

출력

쿼리를 수행할 때마다 그래프의 '좋음'을 한 줄에 하나씩 출력한다.

제한

  • 2≤N≤1052 \le N \le 10^5
  • 1≤Q≤1051 \le Q \le 10^5
  • 1≤Ui,Vi≤N1 \le U_i, V_i \le N (1≤i≤N−11 \le i \le N-1)
  • Ui≠ViU_i \ne V_i (1≤i≤N−11 \le i \le N-1)
  • UiU_i와 ViV_i를 모두 무방향 간선으로 이었을 때 만들어지는 그래프는 트리다.
  • 주어진 그래프에 uiu_i와 viv_i를 잇는 간선이 존재한다.

예제1

  1. 예제 1

    입력
    5
    1 -- 2
    2 -> 3
    2 <- 4
    3 -- 5
    5
    2 -- 4
    2 -> 4
    5 -> 3
    2 -- 3
    3 -- 5
    
    예상 출력
    3
    2
    0
    1
    4