首页 > 试题广场 >

排列

[编程题]排列
  • 热度指数:13 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
n个二维点(a[i],b[i]), 其中1 ≤ i ≤ n,询问有多少种排列p(答案对1e9+7取模)使得执行以下伪代码后留下的点是k,即最后saved=k(其中1 ≤ k ≤ n):
saved=p[1]
for x from 2 to n
    if a[p[x]] >= a[saved] and b[p[x]] >= b[saved]
        saved=p[x]
保证a[i]和b[i]分别为一个排列。

输入描述:
第一行一个整数n(n ≤ 100000),接下来n行每行两个整数表示一个点。


输出描述:
n行每行一个整数表示留下的点为i的排列种数。
示例1

输入

3
1 2
2 3
3 1

输出

0
4
2
头像 __故人__
发表于 2020-09-21 20:30:07
分析 我们对于一个节点 考虑,如果有一个点 两维都大于 ,那么这个节点肯定不可能作为结尾。因为考虑一下,如果排列先出现 ,那么这个两维都是单调不降的,所以不可能转移到 ,反之,如果先出现 ,它一定保持不住结尾,最后整个图构成了一个有向无环图,每一个节点可以等概率转移到后置节点。那么一个 展开全文