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
N>A∗B∣∣N<A+B−1,则无解
若构造不满,先做k1个长度为A的上升子序列,最后有k2个点递减,多出来的添在
k
+
1
k+1
k+1上
(
k
1
+
k
2
+
1
=
B
)
(k1+k2+1=B)
(k1+k2+1=B)
时间效率
O
(
n
∗
t
)
O(n*t)
O(n∗t)
T2:购物(sum)
visit_world 有一个商店,商店里卖N个商品,第i 个的价格为 a[i]我们称一个正整数K 是美妙的,当且仅当我们可以在商店里选购若干个商品,使得价格之和落在区间[K,2K]中。
问:有多少个美妙的数。
orzJyc,辣鸡Hz误导
假设我们已经处理到
s
u
m
sum
sum(
s
u
m
=
∑
j
=
1
i
a
[
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
<
=
s
u
m
\frac {(a[i]+1)}{2}<=sum
2(a[i]+1)<=sum,那么将
a
[
i
]
a[i]
a[i]接在
s
u
m
sum
sum后面和之前不会有间隙,反之则说明从
s
u
m
+
1
sum+1
sum+1到
(
a
[
i
]
+
1
)
2
−
1
\frac {(a[i]+1)}{2}-1
2(a[i]+1)−1之间永远都取不到,取不到的部分记为p
那么答案就成了
s
u
m
=
∑
i
=
1
n
a
[
j
]
−
p
sum=\sum_{i =1}^{n}a[j]-p
sum=∑i=1na[j]−p
时间效率
O
(
n
log
n
)
O(n\log n)
O(nlogn)
T3:计数(count)
考虑一个N个节点的二叉树,它的节点被标上了1∼N 的编号. 并且,编号为i的节点在二叉树的前序遍历中恰好是第i个出现.
我们定义Ai 表示编号为i的点在二叉树的中序遍历中出现的位置.
现在,给出M个限制条件,第i个限制条件给出了
u
i
,
v
i
ui,vi
ui,vi,表示
A
u
i
<
A
v
i
Aui<Avi
Aui<Avi ,也即中序遍历中ui在vi 之前出现.
你需要计算有多少种不同的带标号二叉树满足上述全部限制条件,答案对
1
0
9
+
7
10^9+7
109+7 取模.
此题20%卡特兰数白送。
考虑dp
f
[
i
]
[
j
]
f[i][j]
f[i][j]表示以
i
i
i为头
j
j
j为结尾的子树可能的情况
枚举一个
k
(
i
<
=
k
<
=
j
)
k (i<=k<=j)
k(i<=k<=j),将
i
,
j
i,j
i,j分为两个子树,左子树
i
+
1
,
k
i+1,k
i+1,k,右子树
k
+
1
,
j
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]
f[i][j]+=f[i][k]∗f[k+1][j]
这样子判断效率为
n
4
n^4
n4,考虑优化判断过程
将条件
(
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
(
n
3
∗
t
)
O(n^3*t)
O(n3∗t)