트리 위의 LIS
시간 제한4초메모리 제한1024 MB
트리에서 x_i번 노드에 값 i를 차례로 기록할 때마다, 두 노드를 잇는 경로의 빈 값이 아닌 원소로 만든 최장 증가 부분 수열 길이의 최댓값을 구합니다.
문제
연습 문제가 너무 많은 대회라서, 이번에는 표준적인 자료 구조 문제를 내기로 했다.
정점이 개인 트리가 주어진다. 정점마다 처음에는 값이 비어 있다.
두 정점 사이의 트리 최장 증가 부분 수열(longest increasing tree subsequence)은 다음과 같이 구한다.
- 에서 까지 경로 위의 정점들에서 비어 있지 않은 값을 순서대로 적는다. 이렇게 얻은 수열의 최장 증가 부분 수열(LIS)을 구한다.
수열 의 부분 수열 ()가 를 만족하면 증가 부분 수열이라 한다. 증가 부분 수열 가운데 길이가 가장 긴 것을 최장 증가 부분 수열이라 한다.
이 갱신으로 주어진다. 번째 갱신에서는 정점 에 값 를 적는다. 각 갱신 후에, 모든 정점 쌍 에 대한 트리 최장 증가 부분 수열의 길이 중 최댓값을 구한다.
모든 는 서로 다르다.
입력
첫 줄에 테스트 케이스의 수 ()가 주어진다.
각 테스트 케이스의 첫 줄에는 정점의 수 ()이 주어진다. 다음 개 줄에는 정점 와 ()를 잇는 무방향 간선이 주어진다. 입력으로 주어지는 간선은 트리를 이룬다.
마지막 줄에는 갱신 이 주어진다. 모든 테스트 케이스의 의 합은 을 넘지 않는다.
출력
각 테스트 케이스마다 개의 정수를 공백으로 구분해 한 줄에 출력한다. 번째 정수는 번째 갱신 후의 답이다.
힌트
갱신은 정점 의 값이 라는 뜻이지, 정점 의 값이 라는 뜻이 아니다.