pans

【BZOJ5491】[HNOI2019]多边形(模拟,组合计数)

纵饮孤独 提交于 2020-03-01 11:41:26
[HNOI2019]多边形(模拟,组合计数) 题面 洛谷 题解 突然特别想骂人,本来我考场现切了的,结果WA了几个点,刚刚拿代码一看有个地方忘记取模了。 首先发现终止态一定是所有点都向 \(n\) 连边(看样例图解就知道了) 那么大力猜想一下第一问的答案一定是 \(n-3-\) 和 \(n\) 号点直接相连的边数。 手玩一下,发现这样一件事情:和 \(n\) 直接相连的所有边把多边形分割成了若干个区间,每个区间都用 \([l,r]\) 表示。 对于 \([l,r]\) 这个区间,因为已经分割出来了,也就是除了 \(l-n,r-n\) 之外,没有直接和 \(n\) 相连的边,那么发现这里执行一次旋转操作必定会选择到 \((l,r)\) ,那么只需要找到 \(b\) 点,显然 \(b\) 也是唯一确定的,那么直接在 \(l\) 的出边中找到小于 \(r\) 的最大值就行了,这个点就是 \(b\) 。 发现这次操作执行完之后,这个区间被划分成了两个部分,只需要递归处理就行了。 于是,除了一开始就和 \(n\) 号点直接相连的边之外,每次划分一定把区间分割成两个部分,并且分割操作唯一,因此我们可以把这个过程用一个二叉树来表示。 考虑计算方案数,一个节点表示这个点所代表的操作必须在左右两个儿子之前进行,而分割完这次之后,左右两个儿子之间就独立了,因此等价于左侧有一个操作序列