Noip模拟1 2018/10/17

本文解析了三道算法竞赛题目,包括构造序列、购物美妙数及二叉树计数问题,提供了详细的解题思路与时间效率分析。

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

T1: 序列(seq)
给定 N,A,B构造一个长度为 N 的排列,使得:
排列长度为 N;
最长上升子序列长度为 A;
最长下降子序列长度为 B。
我们有 SPJ,有解任意给出一组,否则说明无解。

感觉挺好想的,只是有解的情况没输出“Yes”,心态爆炸
先考虑N=A*B的情况
那么我们可以构造一个排列,有B个长度为A的上升子序列,满足每个子序列递减
在这么构造的情况下,若N&gt;A∗B∣∣N&lt;A+B−1N&gt;A*B || N&lt;A+B-1N>ABN<A+B1,则无解
若构造不满,先做k1个长度为A的上升子序列,最后有k2个点递减,多出来的添在 k+1k+1k+1(k1+k2+1=B)(k1+k2+1=B)k1+k2+1=B)
时间效率O(n∗t)O(n*t)O(nt)

T2:购物(sum)
visit_world 有一个商店,商店里卖N个商品,第i 个的价格为 a[i]我们称一个正整数K 是美妙的,当且仅当我们可以在商店里选购若干个商品,使得价格之和落在区间[K,2K]中。
问:有多少个美妙的数。

orzJyc,辣鸡Hz误导
假设我们已经处理到sumsumsumsum=∑j=1ia[j]sum=\sum_{j=1}^{i}a[j]sum=j=1ia[j],满足a[i]单调递增),考虑a[i]的贡献。
a[i]a[i]a[i]有贡献的为(a[i]+1)2\frac {(a[i]+1)}{2}2(a[i]+1),假如(a[i]+1)2&lt;=sum\frac {(a[i]+1)}{2}&lt;=sum2(a[i]+1)<=sum,那么将a[i]a[i]a[i]接在sumsumsum后面和之前不会有间隙,反之则说明从sum+1sum+1sum+1(a[i]+1)2−1\frac {(a[i]+1)}{2}-12(a[i]+1)1之间永远都取不到,取不到的部分记为p
那么答案就成了sum=∑i=1na[j]−psum=\sum_{i =1}^{n}a[j]-psum=i=1na[j]p
时间效率O(nlog⁡n)O(n\log n)O(nlogn)

T3:计数(count)
考虑一个N个节点的二叉树,它的节点被标上了1∼N 的编号. 并且,编号为i的节点在二叉树的前序遍历中恰好是第i个出现.
我们定义Ai 表示编号为i的点在二叉树的中序遍历中出现的位置.
现在,给出M个限制条件,第i个限制条件给出了ui,viui,viui,vi,表示Aui&lt;AviAui&lt;AviAui<Avi ,也即中序遍历中ui在vi 之前出现.
你需要计算有多少种不同的带标号二叉树满足上述全部限制条件,答案对
109+710^9+7109+7 取模.

此题20%卡特兰数白送。
考虑dp
f[i][j]f[i][j]f[i][j]表示以iii为头jjj为结尾的子树可能的情况
枚举一个k(i&lt;=k&lt;=j)k (i&lt;=k&lt;=j)k(i<=k<=j),将i,ji,ji,j分为两个子树,左子树i+1,ki+1,ki+1,k,右子树k+1,jk+1,jk+1,j,且左右子树均满足条件,f[i][j]+=f[i][k]∗f[k+1][j]f[i][j]+=f[i][k]*f[k+1][j]f[i][j]+=f[i][k]f[k+1][j]
这样子判断效率为n4n^4n4,考虑优化判断过程
将条件(x,y)(x,y)(x,y)映射到一个二维矩阵上,然后判断(k+1,j)到(i+1,j)(k+1,j)到(i+1,j)(k+1,j)(i+1,j)上有没有不满足的条件,矩阵前缀和一下就好
时间效率O(n3∗t)O(n^3*t)O(n3t)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值