做题记录 25.10.16

\(\textcolor{black}\odot\) AT_arc138_f [ARC138F] KD Tree

\(dp_S\) 表示子集 \(S\) 的答案

显然 \(|S|=1\) 时方案数为 \(1\),答案为 \(dp_U\)

枚举 \(2n-2\) 条分割线,设第 \(i\) 条分割出两个集合 \(T_i\)\(S/T_i\),将 \(T\) 去重并去掉其中等于 \(0\)\(S\)

转化为可以选择一个 \(T_i\)\(S\) 拆为 \(T_i\)\(S/T_i\),求最终得到的不同序列的数量

\(f_i\) 表示选择 \(T_i\) 时的方案数(对于一个方案,若存在多条合法的,则选择 \(T\) 最小的,若不唯一则选择编号最小的),容斥可得 \(f_i=dp_{T_i}-\sum_{j<i,T_j\subset T_i} f_j dp_{T_i/T_j}\)\(dp_S=\sum_i f_i dp_{S/T_i}\)

单个 \(dp_S\) 转移为 \(O(n^2)\) 的,显然 \(S\) 一定为某个子矩形内的全体点,因此只有 \(O(n^4)\) 种,使用记忆化搜索,总复杂度 \(O(n^6)\),常数较小

代码

参考

\(\textcolor{black}\odot\) CF1988F Heartbeat

\(f_{i,j,k}\) 表示长度为 \(i\) 的排列,有 \(j\) 个前缀最大值 \(k\) 个上升位置的方案数,\(g_{i,j,k}\) 表示长度为 \(i\) 排列,有 \(j\) 个后缀最大值 \(k\) 个上升位置的方案数,边界为 \(f_{0,0,0}=g_{0,0,0}=f_{1,1,0}=g_{1,1,0}=0\)

转移时考虑最小值放置在首/尾/一对上升位置之间/一对下降位置之间,易得

\[f_{i,j,k}\to f_{i+1,i+1,j+1}\\ f_{i,j,k}\to f_{i+1,j,k}\\ kf_{i,j,k}\to f_{i+1,j,k}\\ (i-k-1)f_{i,j,k}\to f_{i+1,j,k+1}\\ \]

\[g_{i,j,k}\to g_{i+1,i,j+1}\\ g_{i,j,k}\to g_{i+1,j+1,k}\\ kg_{i,j,k}\to g_{i+1,j,k}\\ (i-k-1)g_{i,j,k}\to g_{i+1,j,k+1}\\ \]

\(n\) 的答案为

\[S_n=\sum_{p=1}^n \sum_i\sum_j\sum_x\sum_y \binom{n-1}{p-1} f_{p-1,i,x}g_{n-p,j,y}a_{i+1}b_{j+1}c_{x+y+[p>1]} \]

\(u_{p,x}=\sum_i f_{p,i,x}a_{i+1}\)\(v_{p,y}=\sum_j g_{p,j,y}b_{j+1}\),则

\[\begin{aligned} S_n=&\sum_{p=1}^n \binom{n-1}{p-1} \sum_x\sum_y u_{p-1,x}v_{n-p,y}c_{x+y+[p>1]}\\ =&(n-1)!\sum_{p=1}^n \sum_x\sum_y \frac{u_{p-1,x}}{(p-1)!}\frac{v_{n-p,y}}{(n-p)!}c_{x+y+[p>1]}\\ \end{aligned} \]

\(S'_n=\frac{S_n}{(n-1)!}\)\(u'_{i,x}\gets \frac{u_{i,x}}{i!}\)\(v'_{i,x}\gets \frac{v_{i,x}}{i!}\),则

\[S'_n=\sum_{p=1}^n \sum_x\sum_y u'_{p-1,x}v'_{n-p,y}c_{x+y+[p>1]}\\ \]

枚举 \(i=p-1,j=n-p,x,y\),将 \(u'_{i,x}v'_{j,y}c_{x+y+[i>0]}\) 贡献到 \(S'_{i+j+1}\)

\(t_{i,y}=\sum_x u'_{i,x}c_{x,y+[i>0]}\),容易把计算 \(S\) 优化到 \(O(n^3)\)

总时间复杂度 \(O(n^3)\),空间复杂度 \(O(n^2)\)

代码

参考

\(\textcolor{blue}\odot\) P14192 [ICPC 2024 Hangzhou R] Fuzzy Ranking

一种暴力的算法为每个 \(a_{i,j}\)\(a_{i,j+1}\) 连边,然后求出 \(\text{SCC}\),对于每个 \(a_{1,\ast}\),其中的 \(\text{SCC}\) 必然为一个区间,因此容易做到 \(O(nk+q\log n)\)

可证所有 \(a_{i,\ast}\) 得到的区间相同,且 \(j\) 为区间右端点当且仅当 \(|\{a_{i,k}\mid k\le j\}|=j\),精细实现容易做到 \(O(nk+q)\)

代码

参考

posted @ 2025-10-17 06:49  Hstry  阅读(3)  评论(0)    收藏  举报