Day1
T1
把数组开大点……
T2
bro写二分写超时了,主要是 check 写了 O(m \times Max) 直接炸了。
T3
bro不会写 dp ,本质上此题只是 01 背包 + 时间限制。 只需要在普通的 01 背包上加一维表示选了几个任务,以及一堆判断是否在规定时间内完成,还是非常简单的。
T4
40pts
先找出每个特异点,然后直接在每个特异点进行一次 bfs 就可以了。
100pts
注意到一棵树上存在着许多的特异点,变成了一个多源的 bfs,直接暴力的话直接将时间复杂度变成了 O(m^2) 显然无法接受。我们可以将所有的特异点都连到一个超级源点上,然后直接从这个源点上进行 bfs 就可以了。
day2
T1
由于这道题目的要求是子序列,我们可以直接排序。由于中位数是最大最小值的平均数,我们可以直接枚举中位数。枚举中位数后我们很容易的发现要使这个数成为中位数,我们必须满足在中位数前方的数和在中位数后方的数相等或者后方的数比前方的数多1。
这样就好办了,我们可以直接使用双指针枚举左右端点统计序列长度。时间复杂度 O(n^2)
当然我们也可以考虑二分(时间更优)
T2
40pts
之际使用朴素做法,枚举所有子区间,然后使用单调队列找出每个子区间的最长下降子序列的长度,世界复杂度 O(n^3) 显然无法接受。
100pts
由于题目条件给出了 \max a_{i}, a_{i + 1} > a_{i + 2} 我们可以很容易的得出我们的题目中最多出现长度为2的上升序列。
首先,我们考虑如果整个式子都是下降的,那么我们可以很容易的证明所有子区间的最长下降子序列的和为 \sum_{i = 1}^{n} i \times (n - i + 1 ) = \frac{n(n+1)(n+2)}{6} 这个非常容易计算得到,于是我们需要考虑的就是还有什么情况会导致所有的和下降。
明显的,在 a_{i + 1} < a_{i + 2} 的情况下总和会减少 1 我们需要知道有多少个子区间包含了这个 i ,显然的左端点需要在 1-i 中选择, 右端点在 i - n 中选择,使用乘法原理,很容易的得到会出现 i \times (n - i) 的减少。
最后我们只需要寻找在整个数组中有多少个这种情况,直接使用原来的总和减去每一个就是最后的答案。
T3
60pts
直接暴力模拟就可以。
100pts
由于越在后面的越不会被覆盖,我们直接将整个序列倒过来处理,先处理最后面的,再处理前面的,其中记录行和列分别被占去了多少个位置。
T4
50pts
直接每次去掉物品后重新跑一遍多重背包就可以了,时间复杂度 O(q \times n^2) 显然无法接受。
100pts
1. 二进制拆分
- 将每个限购次数 c_i 的物品拆分成若干个 0-1 物品。
- 降低复杂度:从 O(nc) 到 O(n \log c)。
2. 前缀 DP 和后缀 DP
- 定义:
- f[i][v] 表示只考虑前 i 个物品时,容量为 v 的最大价值。
- fr[i][v] 表示只考虑从第 i 个物品到最后时,容量为 v 的最大价值。
- 这样我们能在 预处理阶段 就计算好所有前缀和后缀的结果。
3. 处理去掉一个物品
- 若去掉第 d 个物品,容量为 e 时的答案是:
- 解释:
前缀 DP 用来处理 [1 \dots d-1] 的物品,后缀 DP 用来处理 [d+1 \dots n] 的物品,最后合并即可。
4. 复杂度分析
- 预处理 DP:O(n \cdot V)
- 每次查询:O(V)
- 总复杂度:O(nV + qV),在题目范围内可行。
day3
T2
一道典型的思维题。
首先我们可以预处理出 nextl 和 nextr 数组,倒序遍历整个字符串即可,然后我们在 check 函数中使用双指针即可。
T4
为了解决这道题目,我们先约定三个数。
- 小数:如果一个数 x,满足小于等于 x 的数的个数 不足 k−1,那么它永远无法在任意操作中被删去。
- 中数:最小的、不是“小数”的数。
- 大数:比“中数”大的所有数。
先把所有大数全部删去,因为在答案中,如果小数可以构成回文串,大数全都删掉没有任何关系
因为小数永远无法删除,所以如果小数无法构成回文串,那么就直接输出 No
在小数形成的回文结构中对称的加入中数且每个对称位置的中数个数需要匹配,最终需要保证加入的中数数量需要多于 k - 1 个, 否则输出 No 少于 k - 1 个的话无法删除剩余中数。
最后,如果全都符合,那么输出 Yes
Day 4
T1
char 开成 string 然后炸了。
T2
这题需要注意的是一开始需要将0加入我们的set中,否则在某些特定情况下会被卡掉。
T3
我是入机,把freopen打错了。
T4
可以使用 dp 解决这道题目。使用三层循环进行转移,表示将长是 i 宽是 j 的长方形分别在两条边上进行切割,其中切割的长度为 k
Day 5
T1
我又成为入机了, 更新的Max, Min数组后忘记更新 a,b数组
T2
直接暴力枚举将那几行涂成什么颜色即可。
T3
选定两根长度相同的木棒,直接枚举其他两根木棒的长度即可
T4
主要的思路就是使用bfs,在每次行动之前需要判断路径上是否有障碍。
Day6
T1
如果有多个重复的,只能多一个
T4
变种的 bfs, 只需要在普通的bfs上将每个格子可以走两次并且加上关于开关门的判断即可
Day 7
T1
十年OI一场空, 不开()一场空
T3
区间dp,dp[i][j] 表示区间 l-r 的最小消除完毕的数量。