#z1086. 树上排列切分

    ID: 1323 传统题 文件IO:split 1000ms 512MiB 尝试: 1 已通过: 1 难度: 10 上传者: 标签>2026 核桃编程 csp-s 模拟赛

树上排列切分

题目描述

给定一棵有 nn 个顶点的树,以及顶点 1,2,…,n1,2,\ldots,n 的一个排列 p1,p2,…,pnp_1,p_2,\ldots,p_n。

在排列的相邻位置之间进行切分。位置 ii 与 i+1i+1 之间的切分记为 切分点 ii(1≤i<n1\le i<n)。选择 k−1k-1 个不同的切分点后,排列被分成 恰好 kk 个非空连续块。

对于一个块,取出其中出现的所有顶点,并保留树中两个端点都在该块内的边,得到这个块诱导的子图。记该子图的连通分量数为这个块的得分。请计算所有合法切分方案中,各块得分之和的最大值。

输入格式

从文件 split.in 中读取数据。

第一行包含两个整数 n,kn,k。

接下来 n−1n-1 行,每行包含两个整数 u,vu,v,表示树中有一条连接顶点 uu 和 vv 的无向边。若 n=1n=1,这部分没有输入行。

最后一行包含 nn 个整数 p1,p2,…,pnp_1,p_2,\ldots,p_n,表示给出的排列。

输出格式

输出到文件 split.out 中。

输出一个整数,表示最大得分之和。

样例

4 2
1 2
2 3
3 4
1 2 3 4
2
4 2
1 2
1 3
1 4
2 3 4 1
4
5 5
1 2
2 3
3 4
4 5
3 1 5 2 4
5
1 1
1
1

样例解释

样例 #1 解释

无论选择切分点 11、22 还是 33,两个块诱导的子图各有一个 连通分量,因此总得分都是 22。

样例 #2 解释

选择切分点 33 时,左块的三个顶点彼此没有边,得到 33 个连通分量, 右块只有顶点 11,得到 11 个连通分量,总分为 44,这是最大值。

样例 #3 解释

每个块都只有一个顶点,所以每个块的得分为 11,总得分为 55。

数据规模与约定

对于所有数据,保证:

  • 1≤n≤1000001\le n\le 100000;
  • 1≤k≤min⁡(n,20)1\le k\le \min(n,20);
  • 1≤u,v≤n1\le u,v\le n 且 u≠vu\ne v,给出的 n−1n-1 条边互不重复并构成一棵树;
  • p1,p2,…,pnp_1,p_2,\ldots,p_n 是 1,2,…,n1,2,\ldots,n 的一个排列。

本题采用子任务捆绑计分。每个子任务包含若干测试点,只有通过该子任务的全部测试点,才能获得该子任务的分数。各子任务分别计分。

子任务编号 分值 额外约束
11 1010 n≤18n\le 18
22 1515 k≤2k\le 2
33 2525 n≤2000n\le 2000
44 5050 无特殊限制

大样例下载