Noip模拟1 2018/10/17

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

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

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

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

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

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

猜你喜欢

转载自blog.csdn.net/chm_wt/article/details/83117981
今日推荐