做题记录 25.1.27

list

\(\textcolor{green}\odot\) [ABC285E] Work or Rest

预处理 \(w_i\) 表示连续 \(i\) 天工作的总工作量,然后假定第一天是休息日,直接 \(dp\) 即可,时间复杂度 \(O(n^2)\)

代码

\(\textcolor{green}\odot\) P8903 [USACO22DEC] Bribing Friends G

当确定了选出的子集后,显然会选择单位折扣花费甜筒最少的若干个打折扣

将所有朋友根据单位折扣花费甜筒数从小到大排序,则其中某一个为部分用哞尼,部分用甜筒,其前面选出的都用甜筒,其后面选出的都用哞尼

通过从前往后和从后往前的两次 \(0/1\) 背包,可以 \(O(n(a+b))\) 处理出 \(f_{i,j}\) 表示 \(i\sim n\) 中花费 \(j\) 个哞尼所能得到的最大受欢迎度,\(g_{i,j}\) 表示 \(1\sim i\) 中花费 \(j\) 个甜筒所能得到的最大受欢迎度

枚举中间 部分用哞尼部分用甜筒的朋友编号 和 其使用的甜筒数,将 \(f\)\(g\) 合并可得答案

总时空复杂度 \(O(n(a+b))\),需要注意一些细节

代码

\(\textcolor{blue}\odot\) [ABC290F] Maximum Diameter

以下默认 \(n\ne 1\)(虽然 \(n=1\) 时结果也适用)

\(f(x)\ne 0\) 当且仅当 \(\sum_{i=1}^n x_i=2n-2\)\(\forall 1\le i\le n(x_i\ge 1)\)

对于一组满足要求的 \(x_{1\sim n}\),考虑如何构造最长直径

\(k\)\(x\)\(1\) 的数量,即树的叶子数,则可以把 \(n-k\) 个非叶子节点串为链,用叶子补足度数,这样直径上有 \(n-k+2\) 个点,直径为 \(n-k+1\)

问题转化为求

\[\large \sum_{x_{1\sim n}\mid \forall 1\le i\le n(x_i\ge 1),\sum_{i=1}^n x_i=2n-2}\left( n+1-\sum_{i=1}^n [a_i=1]\right) \]

枚举 \(k\),则答案为

\[\large \sum_{k=1}^n (n+1-k)\sum_{x_{1\sim n}\mid \forall 1\le i\le n(x_i\ge 1),\sum_{i=1}^n x_i=2n-2}\left[\sum_{i=1}^n [a_i=1]=k\right] \]

第二个 \(\sum\) 内的部分即为求恰好有 \(k\)\(1\) 的长为 \(n\),总和为 \(2n-2\) 的正整数序列数量

\(1\) 的位置有 \(\binom nk\) 种选择,剩下位置总和为 \(2n-2-k\) 且值 \(\ge 2\),其方案数等于长 \(n-k\) 且总和为 \(2n-2-k-(n-k)=n-2\) 的正整数序列数量,等于 \(\binom{n-2-1}{n-k-1}=\binom{n-3}{k-2}\)

即答案为

\[\sum_k (n+1-k)\binom nk\binom {n-3}{k-2} \]

暴力展开后可直接卷积,时间复杂度 \(O(n\log n+T)\),但有更简单的方法

\[\begin{aligned} &\sum_k (n+1-k)\binom nk\binom {n-3}{k-2}\\ =&\sum_k(n-1)\binom nk\binom {n-3}{k-2} - \sum_k(k-2)\binom nk\binom {n-3}{k-2} \\ =&\sum_k(n-1)\binom nk\binom {n-3}{k-2} - \sum_k(n-3)\binom nk\binom {n-4}{k-3} \\ =&(n-1)\sum_k\binom nk\binom {n-3}{n-1-k} - (n-3)\sum_k\binom nk\binom {n-4}{n-1-k} \\ =&(n-1)\binom{2n-3}{n-1} - (n-3)\binom{2n-4}{n-1}\\ \end{aligned} \]

预处理后可 \(O(1)\) 计算

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

代码

\(\textcolor{blue}\odot\) [ARC156C] Tree and LCS

考虑如下构造:每次取出两个叶子 \(u,v\),令 \(p_u=v\)\(p_v=u\)。若剩下孤点 \(u\),则 \(p_u=u\)

显然所有 \(LCS\)\(\max\) 不超过 \(1\),可证按此方法构造可以取到 \(1\)

代码

参考

\(\textcolor{blue}\odot\) P5749 [IOI2019] 排列鞋子

\(a,b\) 处为 \(-x\)\(c,d\) 处为 \(x\),且 \(a<b,c<d\),则 \(ac\)\(bd\) 分别配对的代价为 \(|c-a-1|+|d-b-1|\)\(ad\)\(bc\) 分别配对的代价为 \(|d-a-1|+|c-b-1|\),分讨可得前者一定不大于后者

因此从左往右扫描原数组,每次找到一个正数 \(x\),就将其与最左侧未匹配的 \(-x\) 匹配

然后考虑放置每个匹配

从左往右扫描,若找到一个没有放置的 \(u\),则找到与之匹配的 \(v\)(显然 \(v>u\)),将 \(v\) 移到 \(u\) 右侧,步数为 \((u,v)\) 中还没有放置的位置数(显然目前为止已经放置的位置都移到 \(u\) 左侧了,树状数组维护之),若 \(u\) 处为正数,则还要增加一步交换两者,然后将 \(u\)\(v\) 标记为已放置

可证其正确性

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

代码

参考

posted @ 2025-01-29 10:30  Hstry  阅读(7)  评论(0)    收藏  举报