abc441

比赛链接

A

简单题

B

简单题

C

\(a _ i\) 从大到小排序,你一定会取容量最大的 \(x\) 个,最坏情况下你只能喝到 \(a _ {k + 1} + a _ {k + 2} + \cdots + a _ x\),对于所有 \(x\) 都判一下。

D

状态数至多只有 \(4 ^ {10}\),暴搜即可。

E

\(s _ i\) 表示 \(1 \sim i\) 前缀中 \(\texttt {A}\)\(\texttt {B}\) 多了几个,那么就是数有多少 \((l, r)\) 满足 \(s _ r - s _ {l - 1} > 0\),类似逆序对用树状数组做一下。

F

其实上你发现需要对于每个物品 \(x\),求出去掉 \(x\) 之后的背包长什么样,这是一个“缺一分治”的经典模型。

具体来说,设计一个函数 solve(l,r),令 \(mid = (l + r) / 2\),先把 \((mid + 1) \sim r\) 的物品加入背包,递归 solve(l,mid);再把 \(l \sim mid\) 的物品加入背包,递归 solve(mid+1,r)。注意加入物品时复制一个新背包,不要覆盖原来的。

这样你发现递归到 solve(x,x) 时恰好把除了 \(x\) 以外的所有物品都加进去了。

由于递归只有 \(\text O (\log n)\) 层,故每个物品只会被加入 \(\text O (\log n)\) 次,时间复杂度 \(\text O (nm \log n)\)

G

首先把题目翻译成人话:刚开始 \(1 \sim n\) 位置都是 1 类型,三种操作:

  1. 把一个区间中所有 1 类型的位置加上 \(x\),并且 \(x\) 为正数;

  2. 把一个区间中所有位置的类型取反(0 变成 1,1 变成 0)并清空;

  3. 求一段区间的最大值。

考虑要维护哪些信息。看到 3 操作肯定要维护 \(\max\),2 操作要求维护反转和清空标记,1 操作要求维护加标记。

但是如果一段区间全是 0 类型,你加一下就炸了。所以还需要维护区间内 1 类型的个数和 0 类型的个数(方便取反),在区间加和下传加标记时特判一下,如果当前区间没有 1 类型就不管它了。

posted @ 2026-01-17 22:35  yemuzhe  阅读(7)  评论(0)    收藏  举报