ABC441

热泪盈眶,自从我的第一场 ABC362 和第一场记录下来的 ABC371,我终于在 98 min 时 AK 了 ABC441,虽然本次比赛题目简单,但过程中我仍然因为压力频繁失误,不过抓住了这次 AK 的几乎仍然是不幸的万幸了,我也通过这场 ABC 升到了蓝名。

图1

图2

A - Black Square

语法题,判断即可,注意是 \(<\) 而不是 \(\le\)

复杂度 \(O(1)\)

B - Two Languages

语法题,可以存储下来两种语言分别能用那些字符,然后判断分讨即可。

复杂度 \(O(n)\)

C - Sake or Water

在这里开始压力变大犯糖,吃了第一发罚时。

我们考虑最后拿了 \(x\) 个杯子。最坏情况下这 \(x\) 杯中容量前 \(k\) 大的都是水,剩下的都是酒。

所以最优策略就是从大往小的取,排序后从 \(k+1\) 开始拿即可,复杂度瓶颈在于排序,为 \(O(n\log n)\)

D - Paid Walk

看上去很吓人,实际上直接暴力搜索就行,搜出所有的路径。

复杂度为 \(O(4^L)\),大概在 \(2\times 10^6\) 级别,轻松解决了。

E - A > B substring

\(sa_i,sb_i\) 表示前缀 \(A,B\) 的出现次数,所求的子串要满足

\[sa_i-sa_j>sb_i-sb_j(0\le j<i\le n) \]

交换可得:

\[sa_i-sb_i>sa_j-sb_j(0\le j<i\le n) \]

\(v_i=sa_i-sb_i\),实际上就是求顺序对数,直接树状数组即可。

注意 \(v_i\) 最小值可能到达 \(-n\),所以要加上偏移量 \(n+1\),不然会 TLE。

复杂度为 \(O(n\log n)\)

F - Must Buy

如何判断一个物品是不是必要的呢。分类讨论,另 \(v_1\) 表示强制选择 \(i\) 的最大价值,\(v_2\) 表示强制不选择 \(i\) 的最大价值。显然 \(\max(v_1,v_2)\) 是直接背包的答案。

  • \(v_1>v_2\):选一定比不选好,说明必须选。

  • \(v_1=v_2\):选不选都一样,说明可选可不选。

  • \(v_1<v_2\):选一定不比不选好,说明不能选。

好的,如何快速求出 \(v_1,v_2\) 呢?考虑求出前缀的背包 \(f_{i,j}\) 表示 \(1\sim i\) 个物品花费 \(\le j\) 的最大价值,后缀 \(g_{i,j}\) 表示 \(i\sim n\) 个物品花费 \(\le j\) 的最大价值,不难实现转移,则答案为:

\[v_1=\max_{j=0}^{m-p_i}\{f_{i-1,j}+g_{i+1,m-p_i-j}+v_i\} \]

\[v_2=\max_{j=0}^m\{f_{i-1,j}+g_{i+1,m-j}\} \]

预处理 \(O(nm)\),计算所有 \(v_1,v_2\) 也是 \(O(nm)\),所以总复杂度为 \(O(nm)\)

G - Takoyaki and Flip

极其纯粹的懒标记线段树,难度并没有很大。

懒标记线段树的重要方法在于能否将区间操作转化为全局操作。

我们考虑维护区间最大值,区间向上的盘子数(用来打第一种操作的懒标记),每个向上的盘子放了多少个章鱼烧,这个区间的盘子翻转了几次。

若对一个区间操作一,若有向上的盘子,则修改最大值和加法标记。

若对一个区间操作二(假设翻转了 \(k\) 次),则无论如何最大值和懒标记都要归零,如果 \(k\) 为奇数,则区间向上的盘子数变成原本向下的盘子数,最后打上翻转标记。

下传懒标记时,先下传翻转标记再下传加法标记,因为翻转会使得加法标记清空。

pushup 时记得更新区间向上盘子数,因为可能翻转单侧区间。

然后简单维护即可,细节比较少。时间复杂度为 \(O(n\log n)\)


说不定跟 ABC371 的我比起,真的有所进步了吧。

晚安。

posted @ 2026-01-17 23:38  zuoqingyuan111  阅读(11)  评论(0)    收藏  举报