B.Construct Sequences
观察数据范围: a i , b i ≤ 1 0 9 , n ≤ 2 × 1 0 4 a_i,b_i\leq 10^9,n\leq 2\times 10^4 ai,bi≤109,n≤2×104
n 2 < 1 0 9 n^2<10^9 n2<109,所以让构造的 a , b a,b a,b公差为 n n n即可。
p i p_i pi就在 a i a_i ai处 + ( i − 1 ) +(i-1) +(i−1)即可。
C.Pushing Balls
辣鸡推式子题!(dp想半天无解)
模拟一轮的操作,发现剩下
n
−
1
n-1
n−1个球与坑的距离还是个等差数列(具体过程略):
每轮移动期望距离
d
+
2
n
−
1
2
x
d+\dfrac{2n-1}{2x}
d+2x2n−1,一轮完毕后
d
′
=
d
+
2
d
+
5
x
2
n
,
x
′
=
x
+
4
x
2
n
d'=d+\dfrac{2d+5x}{2n},x'=x+\dfrac{4x}{2n}
d′=d+2n2d+5x,x′=x+2n4x
所以这道题教会我们:推不出dp就先模拟一轮,说不定变化有规律?
D.Shik and Game
显然最优操作是每次给一段连续区间的熊喂糖,然后回到区间第一只熊的位置依次取硬币,设
f
i
f_i
fi表示最后一个区间以
i
i
i结尾的最优值,转移如下:
f
i
=
m
i
n
(
f
j
+
max
(
T
,
2
(
x
i
−
x
j
+
1
)
)
)
f_i=min(f_j+\max(T,2(x_i-x_{j+1})))
fi=min(fj+max(T,2(xi−xj+1)))
答案即 f n + E f_n+E fn+E
可以单调指针扫到最后一个 j j j满足 2 ( x i − x j + 1 ) ≥ T 2(x_i-x_{j+1})\geq T 2(xi−xj+1)≥T,记录前缀和 min ( f j − 2 x j + 1 ) \min(f_j-2x_{j+1}) min(fj−2xj+1)。对于 2 ( x i − x j + 1 ) < T 2(x_i-x_{j+1})< T 2(xi−xj+1)<T的部分,由于 f i f_i fi单调不降,所以用 f j + 1 + T f_{j+1}+T fj+1+T更新 f i f_i fi即可。
E.Shik and Travel
再一次zz地忽略了题目中的关键性质:满二叉树…
二分答案 m i d mid mid:
因为每条边只能走两次,所以要先选完子树内的叶子结点才能走别的。考虑 d f s dfs dfs遍历这颗树,假设当前处理到 x x x点,它到左右儿子的距离分别为 v 0 , v 1 v_0,v_1 v0,v1。
每个结点维护一个数对 ( a , b ) (a,b) (a,b)集合 S x S_x Sx,其中 a , b a,b a,b分别表示根到第一个叶结点的距离和最后一个叶结点到根的距离。
对于点 x x x,若左儿子集合 S l S_l Sl中的 ( a , b ) (a,b) (a,b)和右儿子集合 S r S_r Sr中的 ( a ′ , b ′ ) (a',b') (a′,b′)满足 b + a ′ + v 0 + v 1 ≤ m i d b+a'+v_0+v_1\leq mid b+a′+v0+v1≤mid,则点 x x x的集合中存在 ( a + v 0 , b ′ + v 1 ) (a+v_0,b'+v_1) (a+v0,b′+v1)。
强制
∣
S
l
∣
≤
∣
S
r
∣
|S_l|\leq |S_r|
∣Sl∣≤∣Sr∣(不满足的
s
w
a
p
(
l
,
r
)
swap(l,r)
swap(l,r)即可),对于
∣
S
l
∣
|S_l|
∣Sl∣中的每个数对
(
a
,
b
)
(a,b)
(a,b):
在
S
r
S_r
Sr中找到满足
b
+
a
′
+
v
0
+
v
1
≤
m
i
d
b+a'+v_0+v_1\leq mid
b+a′+v0+v1≤mid且
b
′
b'
b′最小的数对
(
a
′
,
b
′
)
(a',b')
(a′,b′),将
(
a
+
v
0
,
b
′
+
v
1
)
(a+v_0,b'+v_1)
(a+v0,b′+v1)压入
S
x
S_x
Sx;
在
S
r
S_r
Sr中找到满足
b
′
+
a
+
v
0
+
v
1
≤
m
i
d
b'+a+v_0+v_1\leq mid
b′+a+v0+v1≤mid且
a
′
a'
a′最小的数对
(
a
′
,
b
′
)
(a',b')
(a′,b′),将
(
a
′
+
v
1
,
b
+
v
0
)
(a'+v_1,b+v_0)
(a′+v1,b+v0)压入
S
x
S_x
Sx。
若 ∣ S r o o t ∣ > 0 |S_{root}|>0 ∣Sroot∣>0,则有解。
∣ S x ∣ ≤ 2 ∣ S l ∣ |S_x|\leq 2|S_l| ∣Sx∣≤2∣Sl∣,类似于启发式合并,时间复杂度 O ( n log 2 n ) O(n\log ^2n) O(nlog2n)
F.Shik and Copying String
将 T T T分成若干个内部字符相同的段。对于每段 [ l , r ] [l,r] [l,r]的开头 l l l,找到最大的 i i i满足 i ≤ l i\leq l i≤l且 S 0 [ i ] = T [ l ] S_0[i]=T[l] S0[i]=T[l],那么这一段必然由 S 0 [ i ] S_0[i] S0[i]转移而来。
贪心地看,我们应该倒序逐次地转移得到 T T T的每个段:
红色表示最终转移到的区间,从上到下依次是
S
0
,
S
1
,
S
2
,
S
3
S_0,S_1,S_2,S_3
S0,S1,S2,S3。
特判掉 S 0 = T S_0=T S0=T和 S l = S i S_l=S_i Sl=Si的情况(答案分别为0,1),那么其它情况都存在折线重叠。
考虑双端队列 q q q维护重叠折线,答案即过程中双端队列大小最大值+1(加上折线到 l l l后拓展到 r r r的一步):
考虑加入当前的点 i i i, q [ h e a d ] q[head] q[head]怎样才会限制到 i i i呢?
假设当前加入 3 3 3号点,双端队列中元素为 1 , 2 1,2 1,2,可以发现在 1 1 1的限制下, 3 3 3在第二次转移后最多只能拓展到 q [ h e a d ] − ( h e a d − t a i l ) q[head]-(head-tail) q[head]−(head−tail)的位置——若 l 3 l_3 l3在这个位置之前,那么 q [ h e a d ] q[head] q[head]就限制不到 3 3 3了。
不断弹出队首直至满足 q [ h e a d ] − ( h e a d − t a i l ) ≤ l 3 q[head]-(head-tail)\leq l_3 q[head]−(head−tail)≤l3或者队列为空,然后将 3 3 3加入队尾。并在过程中不断用 h e a d − t a i l + 1 head-tail+1 head−tail+1更新 a n s ans ans。
答案即 a n s + 1 ans+1 ans+1。