做题记录 25.8.6

\(\textcolor{purple}\odot\) CF1614E Divan and a Cottage

线段树维护每个初始值到目前为止变成的值,保存区间 \(\min,\max\) 和区间加法标记,对于一个 \(t\),若 \(\min>t\) 则区间减一,若 \(\max<t\) 则区间加一,若 \(\min=\max=t\) 则直接返回

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

代码

参考

\(\textcolor{purple}\odot\) CF1613F Tree Coloring

考虑容斥,令 \(f_i\) 表示钦定 \(i\)\(c_k=c_{f_k}-1\) 的方案数,则答案为 \(\sum_{i=0}^{n-1}(-1)^i f_i\)

由于 \(c\) 是排列,因此对于一个点至多钦定一个儿子不合法,若 \(u\) 被钦定则选择 \((u,f_u)\),显然形成原树的一种链划分,一共 \(n-i\) 条链,链之间独立,值的分配方式有 \((n-i)\) 种,链划分方式为 \([x^i]\prod_i (1+|son(i)|x)\)

分治加 \(\text{NTT}\) 容易做到 \(O(n\log^2 n)\)

代码

存在 \(O(n\log n)\) 的实现

参考

\(\textcolor{blue}\odot\) CF1612G Max Sum Array

对于一种值 \(i\),设它 \(c_i\) 次出现分别在 \(p_{1\sim c_i}\),则它的贡献为

\[\sum_{1\le x<y\le c_i}(p_y-p_x)=\sum_{1\le x\le c_i}(2x-c_i-1)p_x \]

即选出 \(c_i\) 个位置,分别赋权 \(1-c_i,3-c_i,5-c_i,\cdots,c_i-1\)

\(m\) 个这样的序列放在一起从大到小排序,分别放到位置 \(n\sim 1\) 上,显然最优,方案数为序列内值的等价类大小阶乘之积

暴力实现容易做到 \(O(\sum c_i)\)

记录 \(m\) 个序列之并的桶,则一个序列相当于区间奇 / 偶位置加一,容易差分维护

计算贡献是容易的,时间复杂度 \(O(m+\max c_i)\)

代码

参考

\(\textcolor{purple}\odot\) CF1612F Armor and Weapons

假定 \(n\le m\),若不满足则交换两维

显然答案上限为 \(O(\log n+\frac mn)\)

从小到大枚举答案,令 \(f_i\) 表示当前答案下第一维等于 \(i\) 时第二维的最大值,显然 \(f\) 不升

\(f'\) 为原本的数组,令 \(Q\) 为给定的二元组集合,则转移为

\[f'_i\to f_{i\sim i+f_i+[(i,f'_i)\in Q]}\\ i+f'_i+[(i,f'_i)\in Q]\to f_i \]

一轮转移容易 \(O(n)\) 实现(显然 两种操作转化为前缀取 \(\max\) 都不影响结构,因而可以打标记)

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

代码

参考

\(\textcolor{blue}\odot\) CF1611G Robot and Candies

显然不会有两个出发位置相同(若两条重叠显然删去一条更优,否则找到分离的位置,其中一条从这一位置向上的部分向右平移一位,显然覆盖到的面积变大)

答案上限显然为 \(2\lceil\frac m2\rceil\)(列两两配对,每对用两个),因此路径总长为 \(O(nm)\) 的,考虑贪心地模拟路径覆盖的过程

显然可以令路径不互相穿越(若存在,则交换两条路径的下半部分)

\((1,1)\)\((1,n+m)\) 枚举起点,令 \(s_a\) 表示目前为止 \(x+y=a\) 这一直线上剩余黑点的 \(x\) 坐标的集合

设目前枚举到 \((1,i)\),当 \(s_{1+i}=\mathbb\emptyset\) 时跳过,否则令答案加一,并考虑如何让当前路径尽量多覆盖到黑点

初始令 \((x,y)\gets (1,i)\),重复以下过程直到 \(x>n\)

  • \(s_{x+y}\gets s_{x+y}/\{x\}\)
  • \(s_{x+y}\cup [x+1,n]\)(即当前点左下方还有没覆盖到的点),显然需要 \(x\gets x+1,y\gets y-1\),否则需要之后的路径来覆盖 \(s_{x+y}\) 中剩余的点,产生相穿越的情况,不优
  • 否则应当 \(x\gets x+1,y\gets y+1\),这样能尽量覆盖到更多位置

时间复杂度 \(O(nm\log m)\)

代码

参考

\(\textcolor{purple}\odot\) CF1609F Interesting Sections

考虑分治,设目前处理 \([l,r]\),分治中心为 \(M\)\(l=r\) 时贡献为 \(1\),直接返回

枚举左端点 \(lp\in[l,M]\),令 \(\text{minmax}(a)=[\min a,\max a]\)(值为一个区间)

\(p_1\) 为满足 对于所有 \(rp\in (M,p_1]\) 都有 \([lp,rp]\) 的最小值和最大值都在 \([l,M]\) 的最大值,即满足 \(\text{minmax}(a_{l\sim M})\subseteq \text{minmax}(a_{M+1\sim rp})\) 的最大值

\(p_2\) 为满足 对于所有 \(rp\in (M,p_1]\) 都有 \([lp,rp]\) 的最小值或最大值在 \([l,M]\) 的最大值,即满足 \(\text{minmax}(a_{l\sim M})\not \supseteq \text{minmax}(a_{M+1\sim rp})\) 的最大值

显然两者单调,因此可以双指针

对于一个 \(lp\),考虑 \(rp\)\((M,p_1]\)\((p_1,p_2]\)\((p_2,r]\) 中时的贡献

\(rp\in (M,p_1]\) 时显然 \(lp,rp\) 合法取决于 \(\text{minmax}(a_{l\sim M})\) 合法,因此 \(\text{popcount}(\min a_{l\sim M})=\text{popcount}(\max a_{l\sim M})\) 时贡献为 \(p_1-M\),否则无贡献

\(rp\in(p_2,r]\) 时,贡献为 \(\sum_{i=p_2+1}^r [\text{popcount}(\min a_{M+1\sim i})=\text{popcount}(\max a_{M+1\sim i})]\),预处理 \(ceq_x=\sum_{i=M+1}^x [\text{popcount}(\min a_{M+1\sim i})=\text{popcount}(\max a_{M+1\sim i})]\) 即可

\(rp\in(p_1,p_2]\) 时,若 \(\min a_{lp\sim M}\le \min a_{M+1\sim p_2}\),则贡献为 \(\sum_{i=p_1+1}^{p_2}[\text{popcount}(\min a_{M+1\sim i})=\text{popcount}(\min a_{lp\sim M})]\),开一个桶即可,另一种情况同理

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

代码

参考

posted @ 2025-08-07 08:19  Hstry  阅读(3)  评论(0)    收藏  举报