ABC 乱做

选题:G 位置的计数,Ex


263Ex

261G \(\star\)

\(t\) 变到 \(s\) 更容易一些:一定是 \(t\) 被分成 \(|s|\) 个区间,第 \(i\) 个变成 \(s_i\)。设 \(f[l,r,c]\) 表示 \(t[l:r]\) 变成字符 \(c\) 的最小代价

显然是区间 DP。对于区间 \([l,r]\),枚举操作 \(a,c\),把 \(t[l:r]\) 变成 \(a\) 后就可以变成 \(c\)。设 \(g[i,j]\) 为把 \(t[l:i]\) 变成 \(a[1:j]\) 的最小代价,转移枚举 \(k\),把 \(t[k:i]\) 变成 \(a_j\)
注意 \(|a|=1\) 时转移实际上是最短路,floyd 预处理出 \(dis[i,j]\) 表示字符 \(i\) 变成 \(j\) 的最小代价即可

时间复杂度 \(O(n^{5})\),但毛估估一下 子区间的子区间 个数非常少,根本跑不满

261Ex

DAG 上是平凡的:设 \(f[u,0/1]\) 表示在点 \(u\),轮到 \(0/1\) 操作的答案,根据实际含义转移即可

有环的话初值不变,但无法转移。注意到转移后权值和不降,按 DP 值从小到大转移即可。时间复杂度 \(O(m\log n)\)

wtz 的线性做法:采用记搜的形式。若第二次访问到一个 DP 状态,直接返回 \(\inf\)(注意不是把 DP 值设为 \(\inf\))。第二次访问意味这当前的路径成环,若环上轮到 \(0\) 操作的点有其他出边,那么 \(0\) 一定会走出环;若没有,只能一直绕环,答案就是 \(\inf\)

259Ex

tag:组合数,DP,根号分治

258Ex

tag:DP,矩乘

258G

tag:三元环计数,bitset

不开 LL 见祖宗

257Ex \(\star\)

记最后选出的集合为 \(D\),那么答案为

\[\frac{1}{6^{k}}\sum_{p_{1},\cdots,p_{k}}(\sum_{i\in D}a_{i,p_{i}})^{2}-\sum_{i\in D}c_{i} \\ =\frac{1}{6^{k}}\left(6^{k-1}\sum a_{i,p}^{2}+6^{k-2}\sum2a_{i,p_{i}}a_{j,p_{j}}\right)-\sum c_{i} \]

\(s_{i}=\sum a_{i,p},ss_{i}=\sum a_{i,p}^{2}\)

\[=\frac{1}{6}\sum ss_{i}+\frac{1}{36}\left((\sum s_{i})^{2}-\sum s_{i}^{2}\right)-\sum c_{i} \]

\(b_{i}=6ss_{i}-s_{i}^{2}-36c_{i}\)

\[=\frac{1}{36}((\sum s_{i})^{2}+b_{i}) \]

下忽略常数 \(\frac{1}{36}\)。考虑函数 \(f(x)=\sum s_{i}x+b_{i}\),若 \(x\) 确定,可以贪心选出最大的 \(k\)\(s_{i}x+b_{i}\) 作为 \(D\)
容易发现若最优解的 \(\sum s_{i}=x'\),那么 \(f(x')\) 就等于答案。我们不知道 \(x'\),但若能算出 \(x\) 在每个点的答案,取 \(\max\) 就能得到 \(f(x')\)

考虑 \(x\)\(-\infty\) 变化到 \(\infty\) 的过程,会有一些 \(i\in D\)\(j\not\in D\) 替换掉,我们也只需要在发生替换后重新计算答案。\(j\) 能替换 \(i\) 当且仅当 \(s_{j}x+b_{j}\ge s_{i}x+b_{i}\Rightarrow x\ge\frac{b_{i}-b_{j}}{s_{j}-s_{i}}\)

\(x\) 升序考虑,不断尝试替换后取最优解即可。时间复杂度 \(O(n^{2}\log n)\),瓶颈在于排序

256Ex

tag: 线段树,势能分析

\(\lfloor\frac{a}{c}\rfloor b\ne\lfloor\frac{ab}{c}\rfloor\)

256G

tag: DP,矩乘

竟然做了 40min。。。肯定先枚举每条边选几个,两条边之间的影响只有顶点,DP 状态记一下上一个顶点选没选,矩阵快速幂优化即可
突然发现我 \({n\choose m}\) 没判 \(m<0\)

236Ex

容斥。对于二元组集合 \(s\)\((i,j)\in s\) 表示钦定 \(i,j\) 权值相等,\(f(s)\) 表示满足 \(s\) 中限制的方案数,则答案为 \(\sum(-1)^{|s|}f(s)\)

\(s\) 中限制把 \(n\) 个点分成了若干连通块,考虑逐个加入连通块,剩下的问题是计算集合 \(s\) 带容斥系数的答案。显然方案数 \(\displaystyle g(s)=\lfloor\frac{M}{\text{lcm}_{i\in s}D_{i}}\rfloor\),容斥系数 \(h(|s|)\) 等于 \(\sum_{e}(-1)^{|e|}\)\(e\) 为一个使 \(|s|\) 个点联通的边集。

考虑归纳计算 \(h(n)\)。用任意连边的容斥系数和(\(2^{\frac{n(n-1)}{2}}\) 种,其中奇偶各一半,为 \(0\))减去不连通的和,后者可以枚举 \(1\) 所在连通块 \(s\),若 \(|s|\ne n-1\)\(1,-1\) 相互抵消,不用考虑。因此 \(h(n)=-(n-1)h(n-1)\)

转移:\(\displaystyle dp[s]=\sum_{t\subseteq s,u\in t}dp[s\setminus t]g[t]h[|t|]\),时间复杂度 \(O(3^{n})\)\(u\in t\) 是为了指定加入连通块的顺序。
注意 \(\text{lcm}>M\) 时及时 break

posted @ 2022-06-06 21:57  401rk8  阅读(97)  评论(1编辑  收藏  举报