luogu#P10305. [THUWC 2020] 序排泡冒
[THUWC 2020] 序排泡冒
题目背景
You are given a peach tree .
You don't need to think of the peach.
Because I'm going to talk about the tree.
题目描述
冒泡排序算法是一种广为人知的排序算法,其思路在于不断地交换相邻且逆序的两个元素,由于总的逆序对个数不断减少,冒泡排序算法一定可以终止。给 从小到大排序的冒泡排序算法可以用下面的伪代码描述。
for (int i = 1; i <= k; i++)
for (int j = 0; j < n-1; j++)
if (a[j] > a[j+1]) {
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
其中 称为冒泡排序进行的轮数,当 取 时,便可以保证序列被从小到大排序。
序排泡冒算法是一种鲜为人知的序排算法,其作用是给定一个长度为 的序列 和参数 ,输出所有可能的序列 ,满足其经过 轮冒泡排序之后成为序列 。
给定一棵树 ,结点用 编号。每一个结点 有一个点权 ,保证 构成了 的一个排列。换言之,满足
- 对于 ,均有 ;
- 对于任意的 ,均存在一个 满足 。
对于这棵树,我们将进行 次询问,每次询问给出两个结点 和一个参数 。用 表示从 到 的唯一简单路径上依次经过的所有结点的点权组成的序列,可以看出 就是 , 就是 ,你需要计算序列 和参数 进行序排泡冒后,输出的排列序列个数。换言之,求有多少个序列满足其经过 轮冒泡排序后得到序列 。
由于答案很大,你只需要输出其对 取模的结果(也就是说,输出答案除以 的余数)。
输入格式
第一行包含两个用空格分隔的自然数 ,表示结点个数和询问个数。
接下来的一行包含 用空格分隔的整数 ,表示每个点的点权。
接下来 行每行包含两个数 ,表示树上存在一条连接 和 上的边。输入的数据保证所有的边构成一棵树。
接下来 行每行包含一个询问 ,其意义在题目描述中已经说明。
输出格式
输出包含 行,第 行包含一个整数,表示第 个询问的答案对 取模的结果。
4 4
1 3 2 4
1 2
2 3
3 4
1 1 1
1 2 1
1 3 1
1 4 1
1
2
0
4
见附件中的 2.in。
见附件中的 2.ans。
提示
【样例解释 #1】
在这组样例中,树构成了一个长度为 的链。
- 对于第一次询问,经过的结点序列为 ,点权序列为 ,序排泡冒输出 。
- 对于第二次询问,经过的结点序列为 ,点权序列为 ,序排泡冒输出 。
- 对于第三次询问,经过的结点序列为 ,点权序列为 ,序排泡冒输出 。
- 对于第四次询问,经过的结点序列为 ,点权序列为 ,序排泡冒输出 。
【子任务】
Subtask | Type | Score | |||
---|---|---|---|---|---|
对于所有数据,。
数据类型含义:
- :树构成一条链,即 ,并且所有的询问都满足 。
- :树构成一条链,即 ,并且所有的询问都满足 。
- :无特殊限制。
【提示】
Don't be afraid of the pain in climbing.
Your tough journey is just beginning.
But the fruit you will gain is not only peaches.
Keep counting on the tree! Young gentlemen and ladies.
Hope in your heart will lead you to the destiny.