第十七届湖南程序设计竞赛小结 hncpc2021
痛苦E题
比赛的时候没有认真去思考,这道都还没过就一直看后面的难题。在队友有困难的时候就应该停下手中的题去一起解决。
题目大意
题目意思就是给你一个序列,按照这个序列建立一棵排序二叉树,问你有多少种序列可以形成这种排序二叉树
解题思路 组合数+DFS
一棵二叉查找树任意子树的树根结点一定比其子孙结点更先插入,在左子树结点、右子树结点分别保持正确顺序的前提下,左子树任意结点在右子树任意节点之前或之后没有影响。
设 n 个结点构建一棵二叉查找树的排列个数为 f(n),其左子树结点个数为 x, 右子树结点个数为 y,则左、右子树结点互相穿插的情况数是 x + y 中选 x 或 y 个的组合数。
f(n) = f(x) ∗ f(y) ∗ Cx,x+y
递归可求解。
已ac代码
//
// Created by ilotus on 2021/12/5 20:43
//
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define x first
#define y second
typedef long long LL;
typedef pair<int, int> PII;
const int INF = 1e9;
const int N = 1e3 + 10, mod = 1e9 + 7;
int n;
int s[N][2], e[N], idx;