2017.3.18【NOIP提高组】模拟赛B组

本文分享了一次算法比赛的经验总结,详细解析了四个题目:利用线段树验证切断点合法性;使用动态规划解决喝水问题;采用状态压缩动态规划优化空间复杂度;以及计算特定条件下的组合数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这次比赛我做得一般般,主要问题是第三题空间超限,下次在用状压dp时要估计好空间。

T1:这题可以枚举切断点,设切断点前的和为s1,切断点及切断点后的和为s2,那么如果这个切断点是合法的,那么切断点及切断点后的前缀和都要大于等于s1,切断点前的前缀和都要大于等于-s2。至于判断是否合法,可以用线段树维护最小值。


T2:这题是dp。

因为最多只有四瓶水,所以我们设f[t][i][j][k][l]表示在第t天时距离下一次要喝第一瓶水还剩i天,第二瓶水还剩j天,以此类推。那我们要分情况讨论。

设i,j,k,l中为0的的个数为z。

1、z=0则f[t][i][j][k][l]可以转移到四瓶水都不喝,也可以转移到喝其中一瓶水,但要钱够才行。

2、z=1则f[t][i][j][k][l]可以转移到去喝那瓶距离下一次要喝剩0天的水,但还是要钱够才行。

3、z>1则不合法,无法转移。

初始值为f[0][a[1]][a[2]][a[3]][a[4]]=q


T3:这题是状压dp。设f[i][j]表示当前选第i个点,选择状态为j的最长长度。转移及求答案显然。

下次做这种题时不要设选了前i个,要设为选了第i个,不然既有后效性又会超空间。


T4:

在i<j<k的情况下,设

1、x为a[j]>a[i]且a[k]>a[i]的方案数

2、y为a[i]<a[j]<a[k]的方案数

则ans=x-y

那么我们设mi[i]为第i个位置之前小于a[i]的数的个数,ma[i]为在第i个位置之后大于a[i]的数的个数,那么ans=sum(ma[i]*(ma[i]-1)/2-mi[i]*ma[i])(1<=i<=n)

至于ma与mi,可以用线段树来维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值