做题记录 25.3.14

\(\textcolor{purple}\odot\) CF2021E3 Digital Village (Extreme Version)

考虑优化 CF2021E2 Digital Village (Hard Version) 的动规,发现瓶颈在于转移

\[dp_{w,i}\gets dp_{u,i}+sz_vl\\ dp_{w,i}\gets dp_{v,i}+sz_ul\\ dp_{w,i+j}\gets dp_{u,i}+dp_{v,j} \]

\(dp_{u,0}\gets sz_ul\)\(dp_{v,0}\gets sz_vl\),可把前两种合并到第三种

可证 \(dp\) 为上凸的,因此保存 \(dp\) 的差分数组,第三种相当于归并,multiset 启发式合并可到 \(O(n\log^2 n)\),使用可并堆可到 \(O(n\log n)\)

代码

参考

\(\textcolor{purple}\odot\) CF2021D Boss, Thirsty

\(f_{i,j}\) 表示 \(1\sim i\) 行中第 \(i\) 行左端点为 \(j\) 时的最大总利润,\(g_{i,j}\) 表示 \(1\sim i\) 行中第 \(i\) 行右端点为 \(j\) 时的最大利润

\(s_{i,j}=\sum_{k=1}^j a_{i,j}\)

\(f\)\(g\) 的转移相似,以下只考虑 \(f\) 的转移

边界情况为

\[f_{1,i}=\max_{j=i}^m s_{1,j}-s_{1,i-1} \]

倒序扫描,维护 \(\max_{j=i}^m s_{1,j}\),容易 \(O(m)\) 计算

对于 \(i>1\),转移为

\[f_{i,l}=\sum_{r=l+1}^m\left(s_{i,r}-s_{i,l-1}+\max\left(\max_{t=l+1}^r f_{i-1,t},\max_{t=l}^{r-1} g_{i-1,t}\right)\right) \]

暴力做总时间复杂度可以到 \(O(\sum nm^2)\),需要优化

\[\begin{aligned} f_{i,l}=&\max_{r=l+1}^m\left(s_{i,r}-s_{i,l-1}+\max\left(\max_{t=l+1}^r f_{i-1,t},\max_{t=l}^{r-1} g_{i-1,t}\right)\right)\\ =&-s_{i,l-1}+\max_{r=l+1}^m\max\left(s_{i,r}+\max_{t=l+1}^r f_{i-1,t},s_{i,r}+\max_{t=l}^{r-1} g_{i-1,t}\right)\\ =&-s_{i,l-1}+\max_{r=l+1}^m\max\left(s_{i,r}+f_{i-1,r},s_{i,r}+\max_{t=l+1}^{r-1} f_{i-1,t},s_{i,r}+g_{i-1,l},s_{i,r}+\max_{t=l+1}^{r-1} g_{i-1,t}\right)\\ =&-s_{i,l-1}+\max\left(\max_{r=l+1}^m(s_{i,r}+f_{i-1,r}),g_{i-1,l}+\max_{r=l+1}^m s_{i,r},\max_{r=l+1}^m\left(s_{i,r}+\max_{t=l+1}^{r-1} \max(f_{i-1,t},g_{i-1,t})\right)\right)\\ \end{aligned} \]

其中 \(\max_{r=l+1}^m(s_{i,r}+f_{i-1,r})\)\(\max_{r=l+1}^m s_{i,r}\) 容易 \(O(1)\) 维护,令 \(p_t=\max(f_{i-1,t},g_{i-1,t})\),考虑如何快速计算 \(\max_{r=l+1}^m\left(s_{i,r}+\max_{t=l+1}^{r-1} p_t\right)\)

\[\max_{r=l+1}^m\left(s_{i,r}+\max_{t=l+1}^{r-1} p_t\right)=\max_{t=l+1}^{m-1}\left(p_t+\max_{r=t+1}^m s_{i,r}\right) \]

同样可以 \(O(1)\) 维护

总时间复杂度 \(O(\sum nm)\),空间复杂度可优化到 \(O(\sum m)\)

代码

参考

\(\textcolor{purple}\odot\) CF2013F1 Game in Tree (Easy Version)

显然开始时 \(1\)\(u\) 的链上两方都向中间移动,某时刻一方先离开这条链,之后另一方离开这条链

任意一方离开链之后,其移动步数上限可以确定且可以取到

对于 \(1\)\(u\) 的链上每个点 \(k\),预处理从它离开链之后能走的最大步数 \(f_k\)

然后模拟双方决策,设链上的点为 \(p_{1\sim L}\;(p_1=1)\),目前双方分别在 \(A\)\(B\)\(A<B\)

\(f_{p_A}>\max_{A<i\le B} B-i+f_{p_i}\),则 \(A\) 显然会选择向下,此时 \(A\) 必胜;否则 \(A\) 只能继续沿链向下,令 \(A\gets A+1\),若此时 \(A=B\)\(A\) 必败,使用一个 \(\operatorname{ST}\) 表维护链上的区间 \(f_{p_i}-i\) 最大值即可 \(O(1)\) 决策

\(B\) 的情况同理

总时间复杂度 \(O(n\log n)\),瓶颈在于 \(\operatorname{ST}\) 表的建立,若使用 \(O(n)-O(1)\) \(\operatorname{RMQ}\) 则可到 \(O(n)\)

代码

参考

\(\textcolor{purple}\odot\) CF2006D Iris and Adjacent Products

对于给定的集合,最优排列方式一定是: 最大值,最小值,次大值,次小值,······

因此一个集合合法,当且仅当对于任意 \(i\),集合中第 \(i\) 小值乘以第 \(i\) 大值 \(\le k\)

等价于对于任意 \(1\le i\le 1+\lfloor\sqrt k\rfloor\),总数为偶数且 \(< i\) 的数量不小于 \(>\frac ki\) 的数量,或总数为奇数且 \(<i\) 的数量不小于 \(>\frac ki\) 的数量减一

离线询问,枚举 \(i\) 得到答案的下界,每个询问的答案为其所有下界的最大值

预处理每个前缀中 \(<i\) 的和 \(>\frac ki\) 的数量

对于一个区间 \([l,r]\),设其中 \(<i\) 的有 \(c\) 个,\(>\frac ki\) 的有 \(g\) 个,则可以用 \(\lceil\frac {g-c}2\rceil\) 次修改使得 \(c\ge g\),这样无论奇偶都会合法,或者使用 \(\lfloor\frac {r-l+1}2\rfloor-c\) 次操作令 \(c\gets \lfloor\frac {r-l+1}2\rfloor\)\(g\le (r-l+1)-\lfloor\frac {r-l+1}2\rfloor\),当区间长为奇数时补充了前一种情况

时间复杂度 \(O(\sum (n+m)\sqrt k)\),空间复杂度 \(O(\max (n+m))\)

代码

参考

\(\textcolor{blue}\odot\) CF2006C Eri and Expanded Sets

对于一个集合 \(S\),其扩展出的集合满足以下条件

  • 最大最小值与 \(S\) 相同
  • 排序后形成等差数列
  • 公差为 \(\frac g{\operatorname{lowbit}(g)}\),其中 \(g\)\(S\) 从小到大排序后邻项差的 \(\gcd\)

证明:

  • 第一条性质显然
  • 反证法证明第二条:
    • 假设不为等差数列,则存在相邻的 \(x<y<z\),使得 \(x-y\ne y-z\)
    • \(2\mid (x-y)\) 时,显然可以进一步拓展,因此 \(2\nmid (x-y)\),同理 \(2\nmid (y-z)\)
    • 此时 \(\frac{x+z}2\) 为整数且还没有加入集合,与假设冲突
    • 因此假设不成立,必定为等差数列
  • 第三条可以转化为两个子命题:公差为奇数,且公差为 \(\frac{g}{2^k},k\in\mathbb N\)
  • 前者显然(否则可以继续拓展)
  • 对于后者,显然公差为 \(g\) 的因数,而取到其因数后之后只可能除以 \(2\),因此必然为 \(\frac g{2^k}\) 的形式

考虑如何统计

\(b_i=|a_i-a_{i+1}|\),则答案为 \(b\)区间 \(\gcd\) 等于 \(0\)(即 \(a\) 中对应区间值相同) 或 \(2^k\) 的区间数量\(n\)(即 \(a\) 中单个位置)

对于一个给定的左端点,显然 \(=0\) 的右端点为一段以给定左端点开始的区间,\(=2^k\) 的右端点为一段后缀

因此 \(\operatorname{ST}\) 表配合二分即可

时间复杂度 \(O(n\log^2 n)\),可优化到 \(O(n\log n)\)

代码

参考

\(\textcolor{purple}\odot\) AT_agc018_c [AGC018C] Coins

考虑模拟费用流

先建出二分图:左部 \(n=x+y+z\) 点,源点向左部点连容量 \(1\) 费用 \(0\) 的边,右部 \(3\) 点,分别向汇点连容量 \(x,y,z\) 费用 \(0\) 的边,左侧 \(i\) 向右侧第一点连容量 \(1\) 费用 \(a_i\) 的边,向第二点连费用 \(b_i\) 的边,向第三点连费用 \(c_i\) 的边

\(u,v,w\) 表示不同的左部点,\(x,y,z\) 表示不同的右部点,则流只有三类:\(S\to u\to x\to T\) 表示匹配 \(u-x\)\(S\to u\to x\to v\to y\to T\) 表示反悔 \(v-x\) 并匹配 \(u=x,v=y\)\(S\to u\to x\to v\to y\to w\to z\) 表示反悔 \(v-x,w-y\) 并匹配 \(u-x,v-y,w-z\)

分别用堆维护即可

时间复杂度 \(O(n\log n)\),常数较大

代码

\(\textcolor{green}\odot\) CF2005E1 Subtangle Game (Easy Version)

\(dp\),令 \(dp_{i,j,k}\) 表示保留矩阵 \((i~n,j~m)\) 和序列 \(a_{k\sim l}\) 先手是否必胜,则 \(dp_{n+1,\ast,\ast}=dp_{\ast,m+1,\ast}=dp_{\ast,\ast,l+1}=0\)

转移为 \(dp_{i,j,k}=dp_{i+1,j,k}|dp_{i,j+1,k}|(dp_{i+1,j+1,k+1}\&b_{i,j}=a_k)\),答案为 \(dp_{1,1,1}\)

时间复杂度 \(O(\sum nml)\)

代码

\(\textcolor{blue}\odot\) CF2005E2 Subtangle Game (Hard Version)

在简单版的基础上用 bitset 优化即可,时间复杂度 \(O(\sum\frac{nml}\omega)\)

存在 \(O(nm)\) 的做法

代码

参考

posted @ 2025-03-14 17:39  Hstry  阅读(3)  评论(0)    收藏  举报