A Regular Bracket Sequence
B Discounts
C Painting the Fence
给定长度 $n$ 的序列上的 $q$ 条线段,从中删除两端使得剩余被覆盖位置数量最大。
枚举两个线段,要求计算这两段上有多少个位置只被覆盖一次,线段重合部分上有多少个位置只被覆盖两次。
D Stressful Training
给定 $n$ 台电脑,每台电脑初始有电量 $a_i$,每小时消耗电量 $b_i$,有一个充电器每小时可为一台电脑充电,求使得所有电脑工作 $k$ 天所需要充电器的最小每小时充电量。
考虑二分,贪心构造。每天将没电时刻最早的那台电脑拿出来充电,并且如果某天有多台电脑在此刻没电,那么构造失败。
注意:二分边界,使用数组和指针来维护,而不是上数据结构!
二分不出来的我 T^T。
F Clear the String
给定一个字符串 $s$,每次可以删除一个相同的连续段,求最小删除次数。
区间 DP 裸题。
考虑 $f[l][r]$ 表示删除区间 $[l,r]$ 的花费。
转移时,若 $s[l]=s[r]$
$$
f[l][r]=min(f[l][r-1],f[l+1][r],f[l+1][r-1]+1)
$$
否则
$$
f[l][r]=min(f[l][j],f[j+1][r])
$$
区间 DP 不出来的我 T^T。
G Greedy Subsequences
定义贪心子序列 $a_{p_1},a_{p_2},a_{p_3},\dots$ ,满足,$p_{i+1}$ 是大于 $p_i$ 的第一个满足 $a_{p_{i+1}} > a_{p_i}$ 的下标。
求序列 $a$ 的每一个长度为 $k$ 连续子区间的最长贪心子序列长度。
可以发现,对于整个区间而言,贪心子序列实际上构成的一个树的结构,每个点都会连向唯一一个点,且可能存在前面的若干点连到这个点上。
考虑维护一个单调递减的单调栈,来建出这棵树(森林)。
对于每次询问实际上是在顶点编号在 $[i,i+k-1]$ 范围内的对应虚树上,询问树(森林)的最大高度。
使用线段树维护每个点的高度,区间左指针移动表示虚树上删除了一个点,右指针移动表示虚树扩大,需要给对应子树区间内所有点高度 $+1$。
妙啊!
代码
A
1 |
|
B
1 |
|
C
1 |
|
D
1 |
|
F
1 |
|
G
1 |
|