CF 杂题选做 1月

1609E

Tag:线段树 矩阵 线性动态dp 2400

\(f_{i,0/1/2}\) 表示无 \(a\),有 \(a\)\(ab\),有 \(ab\)\(abc\)
转移矩阵为

\[ \begin{bmatrix} s_i= a&s_i \neq a&+\infty\\ +\infty&s_i = b&s_i \neq b\\ +\infty&+\infty&s_i=c\\ \end{bmatrix} \]

submission

1469E

Tag:水题 2400
\(k\) 比较小的时候直接暴力取出来
考虑到 \(k\) 比较大的时候,答案会有相当多的前缀 \(0\),然后用 \(k\) 比较小的方法去做就好了。

submission

1886E

Tag:贪心 状压dp 双指针 2400

每个项目的分配中我们只需要考虑较小值和数量即可。
先将 \(a_i\) 从大到小排序,如果我们已经确定了一个项目的较小值
那么这个项目分配的值就是以 \(i\) 为右端点的一段连续区间。
那么我们最后即将选取 \([l_1,r_1],[l_2,r_2].....,[l_m,r_m]\)
依据贪心我们希望选取的 \(a_i\) 尽可能大,所以最后挑选的一定是一段前缀。
考虑一个常规的 \(dp\) : \(f_S=k\) 表示 \(S\) 这个集合的项目只需要到 \([1,k]\) 的员工。
转移 :$$\large f_S = to_{x,f_{S'}+1}$$
\(to_{i,j}\) 表示在 \(i\) 项目下,\([j,to_{i,j}]\) 可以装满项目 \(i\)
不难发现可以使用双指针处理。

submission

1381C

Tag:构造 贪心 2500

考虑到我们先确定 \(x\) 个位置,然后判断剩下的元素是否能错开至少 \(y-x\) 个,
因为 \([1,n+1]\) 必定有没出现过的数,设其为 \(X\),超出的可以用 \(X\) 填。
贪心的想,先把出现元素较多的填好,方便我们之后错开元素。
我们将数按照出现次数一一列出,例如 \(1122333\),然后循环位移 \(\lfloor n/2 \rfloor\) 位即可。
注意到最大元素出现次数超过 \(\lfloor n/2 \rfloor\) 则无解,所以先用 \(X\) 进行填充,
直到有解再进行循环位移,最后还剩下多少 \(X\) 没填,再刷上即可。

submission

1983F

Tag:01trie 二分答案 双指针 2500

考虑二分答案 \(x\) ,判断 \(<x\) 的数是否有 \(k-1\) 个。
我们固定 \(r\) ,找出靠近 \(r\)\(l\) 使得 \(a_r \bigotimes a_l \leq x\)
那么对于左端点属于 \([1,l]\) 都是可行的。
考虑使用01trie,按位枚举,在trie树上统计子树内位置最大的编号是多少,
然后根据 \(x\) 的每一位选择走哪棵子树,统计答案。

submission

1326E

Tag:双指针 线段树 2400

不难看出答案 \(k\) 是单调递减的。
我们把 \(\ge k\) 的位置看成 \(1\),删除的位置看成 \(-1\)
显然只要存在一个后缀的和 \(\ge 0\),那么最后就必定剩下一个 \(\ge k\) 的。
直接用线段树维护区间最值即可,支持区间加。

submission

1609F

Tag: 单调栈 线段树 扫描线 2800

我们先用单调栈求出 \(Lmn_i,Rmn_i,Lmx_i,Rmx_i\)
\(Lmn_i\) 表示 \(i\) 左边第一个小于 \(i\) 的位置 \(+1\)
其余三个按照字面意思同理。
我们将 \((Lmn_i,i)\)\((i,Rmn_i)\) (\(mx\) 同理) 作为矩形的左下角和右下角。
将区间映射成坐标系中的点。
那么对于这个矩形中所有的点都是以 \(a_i\) 为最小(最大)值的。
我们将 \(popcnt\) 相同的矩形做一此面积并,同时被 \(mn\)\(mx\) 覆盖的点就是合法点。
考虑线段树维护,同一个点最多被覆盖两次,左线看成 \(+1\),右线看成 \(-1\),维护区间最大值和最大值的数量即可。
当最大值为 \(2\) 的时候,统计答案,时间复杂度 \(O(n\log n)\)
十分卡常,我依靠快读,最后\(1.999s\) 极限卡过。

submission

posted @ 2025-01-11 11:25  Isenthalpic  阅读(15)  评论(0)    收藏  举报