「DP/模拟 Rec.」[7.8 模拟赛] 解题报告

T1 三角形

Description

平面上有 n   ( n ≤ 3000 ) n\ (n \le 3000) n (n3000) 个点,求出用这些点可以构成的三角形数。

Solution

首先考虑 O ( n 3 ) {\rm O}(n^3) O(n3) 暴力,直接枚举三个点判断是否共线,明显不可行。

于是考虑优化到 O ( n 2 log ⁡ n ) {\rm O}(n^2 \log n) O(n2logn)

首先钦定一个点,然后将剩下的点按和这个点的斜率大小排序,从 ( n 3 ) \dbinom{n}{3} (3n) 里减去共线的方案数就好了。


T2 玩具

Description

n   ( n ≤ 40 ) n\ (n \le 40) n (n40) 个玩具,第 i i i 个玩具价格为 p i p_i pi,求挑选出若干个玩具使价格总和超过 L o \rm Lo Lo 且不超过 H i \rm Hi Hi 的方案数。

Solution

注意到 20 ≤ n ≤ 40 20 \le n \le 40 20n40,于是迅速反应可以采用折半状压的方法,处理出 1 ∼ ⌊ n 2 ⌋ 1 \sim \left\lfloor \dfrac{n}{2} \right\rfloor 12n ⌊ n 2 ⌋ + 1 ∼ n \left\lfloor\dfrac{n}{2}\right\rfloor +1 \sim n 2n+1n 的所有挑选方案的价格总和后,二分选择价格总和超过 L o \rm Lo Lo 且不超过 H i \rm Hi Hi 的范围即可。


T3 防空洞

Description

有无数个防空洞,位置都是 1 0 9 + 7 10^9+7 109+7 的倍数。你需要从点 s s s 出发跳跃进任一防空洞。假设当前位置在点 a a a,那么可以跳跃到点 4 a + 3 4a+3 4a+3 或点 8 a + 7 8a+7 8a+7。如果最小跳跃次数 > 1 0 5 > 10^5 >105 次,输出 − 1 -1 1

Solution

Subtask 1

注意到跳跃次数必须在 1 0 5 10^5 105 以内,于是可以考虑在   m o d     1 0 9 + 7 \bmod\ 10^9+7 mod 109+7 意义下跑一遍记忆化搜索,用 m a p \rm map map 存储下状态就好了。

Subtask 2

很容易发现 4 ( 4 ( 4 a + 3 ) + 3 ) + 3 = 8 ( 8 a + 7 ) + 7 4(4(4a+3)+3)+3=8(8a+7)+7 4(4(4a+3)+3)+3=8(8a+7)+7,即 3 3 3 4 a + 3 4a+3 4a+3 操作可以替换为更优的 2 2 2 8 a + 7 8a+7 8a+7 操作,且操作次序不影响答案。

于是可以分别枚举 0 0 0 次、 1 1 1 次、 2 2 2 4 a + 3 4a+3 4a+3 操作所得的结果,分别跑 1 0 5 10^5 105 8 a + 7 8a+7 8a+7 操作看是否能得到   m o d     1 0 9 + 7 = 0 \bmod \ 10^9+7 =0 mod 109+7=0 的结果。


T4 奶牛安家

Description

数轴上有 n   ( n ≤ 1 0 5 ) n\ (n \le 10^5) n (n105) 个点,有 d   ( d ≤ 40 ) d\ (d \le 40) d (d40) 个人要选择不同的点作为家,第 i i i 个人和他旁边人的距离必须 ≥ r i \ge r_i ri,求合法安家方案数。

Solution

考虑 D P \rm DP DP,首先状压肯定是不可行的,折半也行不通。

我们先不考虑 > r i > r_i >ri,我们考虑 = r i =r_i =ri 时的最短距离,后面在用插板法乘上 > r i > r_i >ri 的方案数。

设计状态 f i , j , k f_{i,j,k} fi,j,k 表示考虑到第 i i i 个人,目前数轴上总最短距离为 j j j(后面要根据 j j j 来插板),连通块有 k k k 个(点可以从两边或中间插入,将会使已计算序列分成几段),于是发现三个转移:

  • 新加入的点自成一段,长度不变
  • 在任一段两边加入,长度增加 r i r_i ri
  • 在任一段中间加入,长度增加 r i × 2 r_i \times 2 ri×2

于是得到状态转移方程

f i , j , k = f i − 1 , j , k − 1 × k + f i − 1 , j − r i , k × k × 2 + f i − 1 , j − r i × 2 , k + 1 × k f_{i,j,k}=f_{i-1,j,k-1} \times k +f_{i-1,j-r_i,k} \times k \times 2+f_{i-1,j-r_i\times 2,k+1} \times k fi,j,k=fi1,j,k1×k+fi1,jri,k×k×2+fi1,jri×2,k+1×k

最后再 × ( n − j + d − 1 d ) \times \dbinom{n-j+d-1}{d} ×(dnj+d1) 统计一下就好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值