先总结一下。
策略完全正确,对拍出了很多错误,最终一分不挂。可惜的是,第四题最后没来得及去想出正解,决定使用 O ( n 2 l o g n ) O(n^2logn) O(n2logn)的树状数组写法,拿了 60 60 60分的部分分,全场一堆人切掉这题(sto b6e0 orz),我太菜了……
可能还是要练一下切题吧,不能不管什么难度的题都要在 30 − 60 30-60 30−60分钟内完成,这是对“绝杀”不利的。要保证效率的情况下,节省时间,为后面的大题节省时间。
T1
似乎可以优化到 O ( n ) O(n) O(n)。这里说一下 O ( n ) O(n) O(n)的大常数 d p dp dp。
d p i , a , b , s dp_{i,a,b,s} dpi,a,b,s表示看到了第 i i i位,目前末尾两个字母分别是元音/辅音, s s s表示目前是否有 L L L。
状态转移十分显然,略掉。
T2
首先, O ( n 2 ) O(n^2) O(n2)的 d p dp dp十分显然。
状态设计: d p i dp_i dpi表示看到了第 i i i位的最长链长度。
状态转移就是枚举上一个与其差的绝对值不为 1 1 1的数,尝试从那里来更新答案。但是,有 n ≤ 100000 n≤100000 n≤100000在那里,这显然不是正解。
于是,我套路式地使用了权值线段树优化 d p dp dp。时间复杂度被优化成了 O ( n l o g m ) O(nlogm) O(nlogm),其中 m = m a x a i m=max\ {a_i} m=max ai。
听说可以单调队列做,可惜我不会
T3
一个很显然的贪心: 大的配小的,小的配大的。
简略证明一下。假设原来 a a a配 b b b, c c c配 d d d是最优的,那么 a a a配 d d d, b b b配 c c c就不是最优的。
即,
m
a
x
(
a
+
b
,
c
+
d
)
≤
m
a
x
(
a
+
d
,
b
+
c
)
max(a+b,c+d)≤max(a+d,b+c)
max(a+b,c+d)≤max(a+d,b+c)。
设
b
<
d
b<d
b<d,那么就有
a
+
b
<
a
+
d
,
b
+
c
<
c
+
d
a+b<a+d, b+c<c+d
a+b<a+d,b+c<c+d,消去
a
+
b
,
b
+
c
a+b, b+c
a+b,b+c得到
c
+
d
≤
a
+
d
c+d≤a+d
c+d≤a+d,即
c
≤
a
c≤a
c≤a。
所以,当 b < d b<d b<d的时候, a ≥ c a≥c a≥c最优,印证了上面的那个贪心决策。
每次排序+扫一遍 O ( n 2 ) O(n^2) O(n2),显然会超时。
但是,看到数据范围有一个 x , y ≤ 100 x,y≤100 x,y≤100,于是我们就开桶做,每次双指针扫一遍就完了。
时间复杂度 O ( 100 n ) O(100n) O(100n)。
T4
献上一个神奇的做法。
首先,我们处理出每个战役的权值,表示在这个位置后面,除去第 n n n次的 E n d End End操作中需要的 R P RP RP的最小值。
然后,我们将战役得到的 R P RP RP值从大到小排序,如果这个战役可以选,那么就选;否则就不选。每当我们选择了一个战役参加,就把以这个战役所在区间为开头,以第 n − 1 n-1 n−1个位置为结尾的所有权值全部减去 1 1 1。
不懂?放张图:
使用差分套树状数组维护区间修改与单点查询即可。
时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)。
难度评价
T1: 黄(PJ T2.5)
T2: 绿(PJ T3)
T3: 绿(PJ T3)
T4: 绿(PJ T3)