做题记录 25.5.7

\(\textcolor{blue}\odot\) CF1866D Digital Wallet

类似 \(0/1\) 背包的写法即可,时间复杂度 \(O(nmk)\)

代码

参考

\(\textcolor{blue}\odot\) CF1864F Exotic Queries

\(pr_i\)\(i\) 之前最后一个与 \(a_i\) 相同的位置,不存在则为 \(0\)

对于一组询问 \((l,r)\),答案为

\[\sum_{i=1}^n [l\le a_i\le r][pr_i=0\lor \exists pr_i<j<i(l\le a_j<a_i)] \]

\(p_i=\max\{a_j\mid pr_i<j<i,a_j<a_i\}\),若 \(pr_i=0\) 则令 \(p_i=n\),若集合为空则令 \(p_i=0\)

对值扫描线容易将计算 \(p_i\) 转化为单点修改和区间求 \(\max\),线段树可做到 \(O(n\log n)\)

求出 \(p_i\) 后询问 \((l,r)\) 的答案可表示为

\[\sum_{i=1}^n [l\le a_i\le r][l\le p_i] \]

转化为二维数点,树状数组即可

时间复杂度 \(O((n+q)\log n)\)

代码

\(\textcolor{blue}\odot\) CF1860E Fast Travel Text Editor

容易转化为:有 \(n\) 个点,每个点有权值 \(v_i\),每次询问给定起点和终点,从一个点可以移到相邻点或值相同的点,代价都是 \(1\),每种询问求最小代价

建图方式为:\(\forall 1<i\le n, i-1\leftrightarrow^1 i\)\(\forall 1\le i\le n,i\to^1 n+v_i,i\gets^0 n+v_i\)

\(dst_{i,j}=\text{dis}(i,j+n)\)\(dsf_{i,j}=\text{dis}(j+n,i)\),两者容易通过 \(0/1\) \(\text{bfs}\) \(O(nV)\) 求出

每次询问 \(O(V)\) 枚举中间到达的 \(x\),或者直接过去,容易 \(O(V)\) 处理一组询问

时间复杂度 \(O(nV+qV)\)

代码

参考

\(\textcolor{purple}\odot\) CF1863G Swaps

\(i\)\(a_i\) 连边,则组成内向基环树森林

定义交换 \(a_i\)\(a_{a_i}\) 为操作点 \(i\)

若操作了点 \(i\),设原本 \(i\to j\to k\),若 \(j=k\) 则操作无效,否则变为 \(i\to k,j\to j\)

若令 \(i \to j\to k\) 变为 \(i\to k,j\to j\),则标记边 \(i\to j\)

若此时要操作点 \(i\),则沿着 \(i\) 的出边不断走,标记第一条没有被标记的边

显然一条边的所有入边中至多能标记一条

对于基环树中树的部分显然无论是否标记和标记哪条边都是合法的,令 \(in_i\)\(i\) 的入度,这部分方案数为 \(\prod_{i\notin \text{circle}}(in_i+1)\)

然后考虑一个环 \(C\),发现环上至少有一条边不能标记,且只剩一条边没有标记的方案之间等价

总方案数为 \(\prod_{i\in C}(in_i+1)\),恰好一条边没有标记的方案数为 \(\sum_{i\in C}in_i\),则一个环的合法方案数为 \(\prod_{i\in C}(in_i+1)-1-\prod_{i\in C}+1=\prod_{i\in C}(in_i+1)-\prod_{i\in C}\)

答案为非环的贡献乘以所有环的贡献之积

时间复杂度 \(O(n)\)

代码

参考

\(\textcolor{blue}\odot\) CF1861E Non-Intersecting Subpermutations

\(f_i\) 表示不考虑 \((i,n]\) 的方案数时区间 \([i-k+1,i]\) 的贡献

则答案为 \(\sum_i f_i k^{n-i}\)

不考虑合法性,则 \(f_i=k!\times k^{i-k}\)

从中减去不合法的,枚举 \(i-k+1\le j<i\) 表示 \([j-k+1,j]\)\([i-k+1,i]\) 相交,\([j-k+1,j]\) 中恰好出现了 \(1\sim k\),两者的交 \([i-k+1,j]\) 中有 \(i-j\) 个没有出现,这 \(i-j\) 个要在 \((j,i]\) 中出现,排列方案数为 \((i-j)!\),因此贡献为 \(f_j(i-j)!\)

因此

\[f_i=k!\times k^{i-k}-\sum_{i-k+1\le j<i}f_j(i-j)! \]

时间复杂度 \(O(nk)\)

代码

参考

\(\textcolor{purple}\odot\) CF1859E Maximum Monogonosity

把绝对值拆为 \(4\) 项的 \(\max\),令 \(g_{i,j}\) 表示 \([1,i]\) 中选出若干完整段,段总长为 \(j\) 的最大价值,令 \(f_{i,j,0/1,0/1}\) 表示 \([1,i]\) 中选出若干段,段总长为 \(j\),除了最后一段外都是完整段,最后一段选择了 \(a_l/-a_l\)\(b_l/-b_l\) 的最大价值

转移是容易的,时间复杂度 \(O(\sum nk)\)

代码

\(\textcolor{purple}\odot\) CF1863F Divide, XOR, and Conquer

\(f(l,r)\) 表示区间 \([l,r]\) 是否可达,暴力 \(dp\)\(O(n^3)\)

\(s(l,r)\) 表示区间 \([l,r]\) 的异或和,令 \(\text{hb}(v)\) 表示 \(v\) 二进制下的最高为 \(1\) 的位

区间 \([l,r]\) 可以转移至 \([l,k]\) 当且仅当 \(s(l,k)\ge s(k+1,r)\)

\(s(l,r)=0\) 时任意 \(l\le k<r\) 都合法

\(s(l,r)\ne 0\) 时,必须有 \((s(l,k)\&\text{hb}(s(l,r)))>0\)

从大到小枚举区间长度 \(L\),枚举区间 \([l,r]\)

\(L_l\)\(\text{hb}(s(l,r))\) 的集合满足 \([l,r]\) 合法且 \([l,r]\) 长度大于当前长度,\(R_r\) 同理

\(al_l\) 表示对于所有左端点为 \(l\) 且长度不大于当前区间长度的区间是否都合法,\(ar_r\) 同理

设当前扫描到 \([l,r]\)

\(f(l,r)=[(s(l,r)\& L_l)>0]\lor [(s(l,r)\& R_r)>0]\lor al_l\lor ar_r\lor [Ln=n]\)

\(l=r\) 时可跟新答案

\(f(l,r)\) 则令 \(L_l\) 按位或上 \(s(l,r)\)\(R_r\) 同理,若 \(s(l,r)=0\)\(al_l\gets 1,ar_r\gets 1\)

时间复杂度 \(O(n^2)\)

代码

参考

posted @ 2025-05-10 06:53  Hstry  阅读(1)  评论(0)    收藏  举报