做题记录 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)\),答案为
令 \(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)\) 的答案可表示为
转化为二维数点,树状数组即可
时间复杂度 \(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)!\)
因此
时间复杂度 \(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)\)

浙公网安备 33010602011771号