[AGC040E]Prefix Suffix Addition
Posted StaroForgin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[AGC040E]Prefix Suffix Addition相关的知识,希望对你有一定的参考价值。
Prefix Suffix Addition
题解
首先,对于这道题,我们一个比较容易的想法是将整个序列拆成一个序列
B
B
B和一个序列
C
C
C,满足
A
i
=
B
i
+
C
i
A_i=B_i+C_i
Ai=Bi+Ci。
我们对于序列
B
B
B中的数执行操作
1
1
1,序列
C
C
C中的数执行操作
2
2
2。
这样,我们就能将对一个序列进行两种操作变为对两个序列执行方向不同的一种操作。
我们观察一个序列的情况,如果我们被允许从一端开始减去一个递增序列最少多少次能把它减完。
可以发现,这样减完序列
A
A
A的答案为
∑
i
=
1
n
[
A
i
>
A
i
+
1
]
\\sum_i=1^n [A_i>A_i+1]
∑i=1n[Ai>Ai+1]。
显然,我们会尝试从
a
n
a_n
an到
a
1
a_1
a1,不断把数减为
0
0
0,在
a
i
+
1
a_i+1
ai+1减到
0
0
0时,
a
i
a_i
ai被减的值不会超过
a
i
+
1
a_i+1
ai+1。如果
a
i
+
1
⩾
a
i
a_i+1\\geqslant a_i
ai+1⩾ai,那么减完
a
i
+
1
a_i+1
ai+1时也可以把
a
i
a_i
ai减完,否则需要多执行一次操作。
反过来操作同理,所以最后的答案为
∑
i
=
0
n
[
B
i
>
B
i
+
1
]
+
[
C
i
<
C
i
+
1
]
\\sum_i=0^n [B_i>B_i+1]+[C_i<C_i+1]
∑i=0n[Bi>Bi+1]+[Ci<Ci+1]。
我们可以考虑对这东西进行
d
p
dp
dp。
定义
d
p
i
,
j
dp_i,j
dpi,j表示
B
i
=
A
i
−
j
,
C
i
=
j
B_i=A_i-j,C_i=j
Bi=Ai−j,Ci=j时前缀所产生的最小贡献。
显然,我们是比较容易地写出它的
d
p
dp
dp转移式的,
d
p
i
,
j
=
min
k
=
0
A
i
−
1
(
d
p
i
−
1
,
k
+
[
j
>
k
]
+
[
A
i
−
j
<
A
i
−
1
−
k
]
)
dp_i,j=\\min_k=0^A_i-1\\left(dp_i-1,k+[j>k]+[A_i-j<A_i-1-k]\\right)
dpi,j=k=0minAi−1(dpi−1,k+[j>k]+[Ai−j<Ai−1−k])
当然,直接这样转移是
O
(
n
A
)
O\\left(nA\\right)
O(nA)的,显然不行,考虑优化。
我们可以从上面的转移式发现一个性质:
- ∀ j < k ( j , k ∈ [ 0 , A i ] ) , d p i , k − d p i , j ∈ [ 0 , 2 ] \\forall j<k(j,k\\in[0,A_i])\\,,\\,dp_i,k-dp_i,j\\in[0,2] ∀j<k(j,k∈[0,Ai]),dpi,k−dpi,j∈[0,2]
这相当于说它是单调不降的并且最大值与最小值差不会超过
2
2
2。
单调不降这点是比较好理解的,对于
j
<
k
(
j
,
k
∈
[
0
,
A
i
]
)
j<k(j,k\\in [0,A_i])
j<k(j,k∈[0,Ai]),如果
k
k
k的最优转移点为
p
k
p_k
pk的话,那么我们先假令
j
j
j也从
p
k
p_k
pk转移过来有:
[
j
>
p
k
]
+
[
A
i
−
j
<
A
i
−
1
−
p
k
]
⩽
[
k
>
p
k
]
+
[
A
i
−
k
<
A
i
−
1
−
p
k
]
⇔
[
j
>
p
k
]
−
[
k
>
p
k
]
+
[
A
i
−
j
<
A
i
−
1
−
p
k
]
−
[
A
i
−
k
<
A
i
−
1
−
p
k
]
⩽
0
⇔
[
j
⩽
p
k
<
k
]
+
[
A
i
−
k
⩽
A
i
−
1
−
p
k
⩽
A
i
−
j
]
⩾
0
[j>p_k]+[A_i-j<A_i-1-p_k]\\leqslant [k>p_k]+[A_i-k<A_i-1-p_k]\\\\ \\Leftrightarrow[j>p_k]-[k>p_k]+[A_i-j<A_i-1-p_k]-[A_i-k<A_i-1-p_k]\\leqslant 0\\\\ \\Leftrightarrow[j\\leqslant p_k<k]+[A_i-k\\leqslant A_i-1-p_k\\leqslant A_i-j]\\geqslant0
[j>pk]+[Ai−j<Ai−1−pk]⩽[k>pk]+[Ai−k<Ai−1−以上是关于[AGC040E]Prefix Suffix Addition的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode 745. Prefix and Suffix Search
[LeetCode] Prefix and Suffix Search 前后缀搜索
mybatis之<trim prefix="" suffix="" suffixOverrides="" prefixOverride