做题记录 25.4.28

\(\textcolor{blue}\odot\) CF1895E Infinite Card Game

建图,每个点连向对方攻击值高于该点防御值的点中防御值最高的一个,显然这样最优,于是得到的图出度至多为一,容易求出每个点的必胜方,时间复杂度 \(O(\sum (n\log n+m\log m))\)

代码

参考

\(\textcolor{blue}\odot\) CF1891E Brukhovich and Exams

\(a_i\)\(a_{i+1}\) 不互质,或 \(a_i\)\(a_{i+1}\) 中恰好一个为 \(1\),则把序列从 \(i\)\(i+1\) 之间断开,这样序列被划分为若干连续段,其中一部分段全为 \(1\),称为一类,剩余的段内都 \(\ne 1\) 且相邻数两两不互质,称为二类

\(\gcd(a_i,a_{i+1})=1\) 的贡献在 \(i\) 上,则对于二类段 \([L,R]\),区间 \([L,R)\) 内的位置都有贡献,对于一类段 \([L,R]\) 区间 \([L-1,R]\cap [1,n)\) 内的位置都有贡献

考虑把位置置为 \(0\) 后对两类段贡献的影响

对于二类段 \([L,R]\)\([L,R)\) 产生贡献,对于任意 \(L<i<R\),若 \(a_i\gets 0\)\(i-1\)\(i\) 都不再产生贡献,若 \(a_L\gets 0\)\(L\) 不再产生贡献,对贡献的影响可以拆分为 \(\lfloor\frac{R-L}2\rfloor\) 个 “选择一个位置置 \(0\) 使得贡献减 \(2\)” 和 \((R-L)\bmod 2\) 个 “选择一个位置置 \(0\) 使得贡献减 \(1\)

对于一类段 \([L,R]\),若 \(L=1\)\(R=n\),即整个 \(a\) 都是 \(1\),则答案为 \(n-k\),若 \(L=1\)\(R=n\) 只有一个成立,则对贡献的影响为 \(R-L+1\) 个 “选择一个位置置 \(0\) 使得贡献减 \(1\)”,若 \(L\ne 1\)\(R\ne n\),则对贡献的影响为“\(R-L\) 次选择一个位置置 \(0\) 使得贡献减 \(1\),第 \(R-L+1\) 次可以选择一个位置置 \(0\) 使得贡献减 \(2\)

只有三种形式:“选择一个位置置 \(0\) 使得贡献减 \(2\)”,“选择一个位置置 \(0\) 使得贡献减 \(1\)”,“\(R-L\) 次选择一个位置置 \(0\) 使得贡献减 \(1\),第 \(R-L+1\) 次可以选择一个位置置 \(0\) 使得贡献减 \(2\)

有限选择第一种,然后按长度从小到大选择第三种,最后选择第二种,显然最优

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

代码

参考

\(\textcolor{purple}\odot\) CF1893D Colorful Constructive

对于长为 \(l\) 的序列限制为 \(d\),若区间 \([0,d),[d,2d),\cdots,[l-(l\bmod d),l)\) 内数都各不相同,则存在一种重排方式使得整个长为 \(l\) 的序列符合限制

构造方式为:先把 \([l-(l\bmod d),l)\) 块中的数放到最前面,然后依次考虑剩下的 \(\lfloor\frac ld\rfloor\) 块,每块中的数字按上一块中出现的次序排序,上一块中没有出现的排在最前面,给定满足初始要求的序列后容易 \(O(l\log d)\) 构造出符合题目要求的序列

于是转化为给定 \(l_{1\sim k}\),要把 \(n\) 个数划分到 \(k\) 组内,使得大小分别为 \(l_{1\sim k}\) 且组内数互不相同

从大到小考虑 \(l_i\),每次取出出现次数最多的 \(l_i\) 个数字放到一个组中,若剩余数字种类不足 \(l_i\) 则无解,可证这一贪心的正确性

这一过程容易堆维护

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

代码

参考

\(\textcolor{blue}\odot\) CF1900F Local Deletions

发现经过一次操作(保留 \(\min\) 和保留 \(\max\) 分别视为一次)后 \(n\) 个数最多保留 \(\lceil\frac n2\rceil\) 个,因此经过 \(\log_2(n)+O(1)\) 次后必然结束

预处理整个序列经过 \(0\sim \log_2(n)+O(1)\) 次操作后剩余下标集合 \(P_i\)

对于一个区间,发现只有边缘处可能和预处理结果不同,因此维护 \(lp,rp,l,r\),表示目前剩余下标集合为 \(\{lp\}\cup (P_i\cap [l,r])\cup\{rp\}\),其中 \(lp\)\(rp\) 可以不存在,细节较多

时间复杂度 \(O(n+q\log^2 n)\),空间复杂度 \(O(n)\)

代码

参考

\(\textcolor{blue}\odot\) CF1887C Minimum Array

扫描操作,令 \(rs\) 表示目前字典序最小的版本号,初始为 \(0\),树状数组内保存从 \(rs\) 到当前版本的增加量的差分数组,用 set 保存目前为止增加量数组中可能 \(\ne 0\) 的位置集合,每次区间加 \((l,r,v)\) 时,树状数组上直接维护,并把 \(l\)\(r+1\) 加入 set 中,删除 set 中前面若干个值已经为 \(0\) 的位置(值指增加量数组的值,即差分数组的前缀和,实际上维护 set 只是需要得到第一个值不为 \(0\) 的位置),若第一个不为 \(0\) 的位置的值 \(<0\),令 \(rs\) 为当前版本,并清空树状数组(撤销操作即可)和 set

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

代码

参考

\(\textcolor{purple}\odot\) CF1887D Split

对于每个 \(i\),考虑计算出有多少区间 \([l,r]\),满足存在一个分割点 \(l\le k<r\),使得 \(i\)\([l,k]\) 中的最大值

\(lg_i\)\([1,i)\) 中编号最大的 \(>a_i\) 的位置,不存在则为 \(0\)

\(rg_i\)\((i,n]\) 中编号最小的 \(>a_i\) 的位置,不存在则为 \(n+1\)

\(rl_i\)\((rg_i,n]\) 中编号最小的 \(<a_i\) 的位置,不存在则为 \(n+1\)

则对于一个 \(i\),所有区间 \([l,r]\mid lg_i<l\le i<rg_i\le r<rl_i\) 都合法

扫描线即可,时间复杂度 \(O(n\log n)\)

代码

参考

posted @ 2025-04-30 08:34  Hstry  阅读(6)  评论(0)    收藏  举报