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

T1:如果两点在障碍的同一侧,那么直接计算距离。

如果两点在不同侧,那么使用二分查找,如果有一个通行处a[i]满足x1<=a[i]<=x2,则x1,x2的距离还是直接算。要是找不到这样一个a[i],那么找一个最接近x1的和一个最接近x2的,从两个当中选取答案最小的就行了。


总结:

1、比赛时因为把x与y搞混,(y决定是否在同一侧,x决定是否在中间)。


T2:如果存在一段连续递增或连续递减的,可以把这一段合并。把所有可以合并的合并之后在做n^2的dp就行了。

注意:合并之后差的平方不能直接计算,得预处理好。

总结:

1、做题时要先找性质,不要急着去想算法。


T3:树形dp。

设g[i]表示第i个节点的ans,f[i][j]表示把i个人与j个人合并的方案数(j个人的根比i个人的根弱),num[i]表示以第i个节点为根的子树的节点的个数。
那么我们先预处理出f[i][j]。f[i][1]=i,f[1][j]=1,f[i][j]=f[i-1][j]+f[i][j-1]。

然后我们处理出num,最后求g。

我们从根节点开始dg,不过要倒着枚举每个节点的子节点(从弱到强),则g[x]=g[x]*f[num[i],sum]*g[i],x为当前要求的节点,i为当前枚举到的子节点,sum为比i要弱的所有节点j的num[j]的和。最后输出f[1]。


总结:

1、这类题做的时候要找出每一个点的答案是由那几部分组成的,在规划计算。


T4:把1看成1,0看成-1,设s[i]表示第i个位置的前缀和。则绝对值最大的最小值=|s[n]|/m向上取整。

求出这个ans之后,我们开始分段,字典序最大就是倒过来之后字典序最小,所以我i们只讨论字典序最小怎么求。我们如果要分一段,那么要满足这一段本身合法,并且它之后的段也合法,合法就是绝对值之差不大于预定的ans,这样我们可以顺着搜一遍,一旦找到合法位置就分,最后输出即可。

ans=|s[n]|/m向上取整的证明:

|s[n]|代表的是男女之差的绝对值,那么我们要把这些数量尽量平分到每一段里去,那么ans=|s[n]|/m就是最优解。关键是怎样保证一定能分出满足ans的m段来呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值