Processing math: 2%

YZOJ P1310 [省队训练][NOI模拟7]车的放置

YZOJ P1310 [省队训练][NOI模拟7]车的放置

时间限制:1000MS      内存限制:262144KB

难度:8.0

  • 题目描述

N1 \times h[i] 的矩形小棋盘,底边边长为 1,在一条直线上拼成了一个畸形的棋盘。

高度 h[i] 给出,第 i 个矩形的高为 h[i],例如 h = [3, 2, 4, 2] 的图形如下:

若两个车相互攻击仅当它们在同一列,或在同一行且在这一行它们之间棋盘格子都是存在的,例如上图中 ab 是相互不攻击的,cdbc 均为相互攻击的。

现在要在这棋盘上放置恰好 K 个相互不攻击的车,问有多少种方案。

  • 输入格式

输入第 1 行包括两个正整数 NK,表示了棋盘的列数和放的车数。

2 行包含 N 个正整数,表示了棋盘每列的高度。

  • 输出格式

输出包括一个非负整数,表示有多少种放置的方案,输出答案 \mod 1000000007 后的结果即可。

  • 样例输入

  • 样例输出

  • 数据规模与约定

对于 100\% 的数据,有 N \leq 500K \leq 500h[i]  \leq 1000000

 

 

 


 

 

 

把笛卡尔树建出来,在上面树形DP。

为了方便,在这里认为 笛卡尔树中的一个点 i 表示的矩形 不包括它的所有子节点所表示的矩形,即这个矩形的宽为 W=size_i ,高为 H=h_{i}-h_{father}

f_{i, j} 表示以 i 为根的子树中放 j 个车的方案数;t_{i, j} 表示以 i 为根的子树中放 j 个车,并且这 j 个车都不在 i 表示的矩形中 的方案数。

那么有 t_{i, j} = \sum\limits_{k=0}^{j}{f_{lson, k} \times f_{rson, j-k}}

还有 f_{i, j} = \sum\limits_{k=0}^{j}{ t_{j-k} \times C_{H}^{k} \times C_{W-\left(j-k\right)}^{k} \times k!}

初始值 f_{0, 0}=1

时间复杂度 O(nk^2)

 

 

 

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注