给你三个序列
a
,
b
,
c
a,b,c
a,b,c,保证
a
+
b
+
c
a+b+c
a+b+c是个排列。问你能否通过把一个序列的数字移到另一个序列当中(花费为
1
1
1)使得
a
a
a为组成排列的前缀,
c
c
c为后缀(
a
,
b
,
c
a,b,c
a,b,c可以为空)。问构成合法
a
,
b
,
c
a,b,c
a,b,c的最小花费。
∣
a
∣
+
∣
b
∣
+
∣
c
∣
≤
2
e
5
|a|+|b|+|c|\leq 2e5
∣a∣+∣b∣+∣c∣≤2e5
S
o
l
\mathrm{Sol}
Sol
考虑如何去构造:
我们枚举
a
a
a序列结束位置为
l
(
0
≤
l
≤
∣
a
∣
)
l(0\leq l \leq |a|)
l(0≤l≤∣a∣),在枚举
c
c
c的起始位置为
r
(
l
≤
r
≤
n
+
1
)
r(l\leq r\leq n+1)
r(l≤r≤n+1)
我们再设
a
l
l
=
∣
a
∣
+
∣
b
∣
+
∣
c
∣
all=|a|+|b|+|c|
all=∣a∣+∣b∣+∣c∣,
s
a
sa
sa表示第一个人前
a
l
l
all
all个数中拥有的个数,
s
b
,
s
c
sb,sc
sb,sc同理,这个我们可以
O
(
n
)
O(n)
O(n)预处理出来。
对于每次枚举的
l
,
r
l,r
l,r我们总花费为
s
b
l
+
s
c
l
+
(
s
a
r
−
s
a
l
)
+
(
s
c
r
−
s
c
l
)
+
(
s
a
a
l
l
−
s
a
r
)
+
(
s
b
a
l
l
−
s
b
r
)
sb_l+sc_l+(sa_r-sa_l)+(sc_r-sc_l)+(sa_{all}-sa_r)+(sb_{all}-sb_r)
sbl+scl+(sar−sal)+(scr−scl)+(saall−sar)+(sball−sbr)
化简可得:
m
i
=
s
b
l
−
s
a
l
+
s
c
r
−
s
b
r
+
s
a
a
l
l
+
s
b
a
l
l
mi=sb_l-sa_l+sc_r-sb_r+sa_{all}+sb_{all}
mi=sbl−sal+scr−sbr+saall+sball
那么可以大力发现对于每一个
l
l
l,要使
s
c
r
−
s
b
r
sc_r-sb_r
scr−sbr最小。那么我们设一个
m
i
l
mi_l
mil表示
l
≤
r
≤
n
l\leq r \leq n
l≤r≤n 时候
s
c
r
−
s
b
r
sc_r-sb_r
scr−sbr的最小值。
O
(
n
)
O(n)
O(n)做一遍即可