THUWC2025题解

Day 1

T1

构造一个排列,使满足最多的形如 \([l,r]\) 内单调递增/减。

一个简单的线段树优化 DP,设状态 \(f_{i,0/1}\) 即可转移,\(O(n\log n)\)

T2

支持往集合中加三维带权点,查询集合中没有任何一维与给出点对应维度相等的最大点权。

唐题。

一种暴力的想法是三维数点之类的,不太能过。

考虑维护已有的 \(w\) 最大的点 \(b_0\),如果这个点可以,就直接得出答案,否则利用维护好的 \((x),(x,y),(x,y,z),(y),\dots\) 必须与 \(b_0\) 不同,其他任意的最大权点 \(b_{1,2,\dots,8}\) 找答案。

注意到对于 \((x)\) 必须与 \(b_0\) 不同的点 \(b_1\),还要再维护 \((x)\) 必须与 \(b_0\) 不同、\((y),(z),(y,z)\) 必须与 \(b_1\) 不同的 \(3\) 个最大权点。

类似的算一下可以发现一共要维护 \(1+3\times6+3\times2+1=26\) 个点。

于是复杂度 \(O(26n)\)

T3

对于序列 \(S,S_i\in\{1,-1\}\),参数 \(k\) ,维护一个大小为 \(k\) 的栈,\(+1\) 加入元素(加入后栈大小 \(\le k\)),\(-1\) 弹出元素(非空时)。若加入失败,贡献 \(+8\);若成功删除,贡献 \(+16\);若结束时栈中剩下 \(x\) 个元素,贡献 \(+3x\)。设总贡献为 \(f_k(S)\)\(Q\) 次询问求 \(\max\limits_kf_k(S[l,r])\)

首先算一个 \(8(r-l+1)\) 的贡献,这样失败的删除 \(-8\);最后剩下的元素 \(-5\)

不妨最初让 \(k=0\),不难发现,只要 \(\Delta>0\) 一定增大 \(k\),且 \(\Delta\) 单调。所以最终 \(k\) 的取值就是第一个 \(\Delta\le0\) 的位置。注意到,此时失败的删除个数等于 \(k=\infty\) 时的个数。

具体怎么算呢?不妨把序列前缀和 \(pre\) 最小的位置 \(p\) 拿出来。我们发现,失败的删除一定在 \(p\) 的左边,且个数等于 \(pre_p\),这等价于左边所有加操作均对应一个减操作。同样,必然在 \(p\) 右边才会有加入失败的点,这等价于右边所有减操作都对应一个加操作(不难发现)

由加粗两点可知 \(k=\max(\text{左边最大区间和},-\text{右边最小区间和})\)

注意到,加入失败的点数等于 \(\max\limits_{i=p+1}^rpre_i-pre_p-k\)。于是最终剩下的点数也是好算的。

T4

给出操作序列 \(S_i\in\{1,2,3\}\),变量 \(s=0,a,b\),要选出 \(k\) 个操作依次执行,使 \(s\) 最大。

  1. s+=a
  2. a+=b
  3. s*=2

首先,选出的 \(2,3\) 操作必然是一个前缀、后缀。其次是最多选 \(O(\log)\)\(1,2\) 操作。

枚举 \(2,3\) 操作个数,然后再怎么搞一搞,存数的话用 \(a\times 2^b,2\perp a\)

posted @ 2025-01-18 16:09  mRXxy0o0  阅读(131)  评论(0)    收藏  举报