CF 杂题选做 2月

1582C

Tag:线段树 贪心 2300

考虑到把一个 \(2\) 树的一个点 \(u\) 加进集合的时候
如果 \(u\) 的子树内已经有点 \(v\) 加进来,那么此时去除 \(v\)\(u\) 绝对是不优的
因为可选点会减少,但是答案不会增加,所以我们对 \(1\) 树 dfs。
每次遇到一个点 \(x\),如果他祖先有个点选进集合,就去掉祖先选为 \(x\)
如果他的子树有点被选,那么就不能选这个点。
如果不是上述两种情况就选择 \(x\)
然后可以用线段树 + dfn序维护上述过程,时间复杂度 \(O(n\log n)\)

submission

2069E

Tag:思维 贪心 2300

考虑到两个相邻的的相同字母之间必须分开
所以最后会被分成若干段 \(AB\) 交替的形状
一开始我们先默认 \(A\)\(B\) 全部分开,然后在满足 \(AB\)\(BA\) 限制的情况下去合并。
首先对于奇数长度的 \(ABA...BA\) 的,分成 \(AB\)\(BA\) 是等效的,也就是能泛用。
那么对于长度为偶数 \(len\) 的话,可以进行 \(\frac{len}{2}-1\) 的泛用,也可以 \(\frac{len}{2}\) 的用其中一个。
那么我们要做的就是在满足限制的前提下尽量使 \(\frac{len}{2}\) 的使用尽量多。
我们对于每个偶数段都可以贡献 \(1\) 的消除,我们把偶数段排序,尽量取小的进行转化。

submission

1004D

Tag:思维 暴力构造 2300

挺有意思的题,不是很难。
显而易见先枚举 \(t\) 的约数可以得到矩形的大小。
考虑到答案有对称性,所以我们可以钦定把 \(0\) 放在矩形的左上角,也就是第二象限。
那么我们根据最大值,可以得出 \(0\) 所在的轨迹是一个斜率为 \(1\) 的一次函数。
然后我们再考虑一个性质:如果矩形的大小是无限的,那么 \(0,1,2...t\) 各种值的出现次数是固定的
其中 \(0\) 出现次数是 1,其余的就是 \(4 \times i\)。所以我们找到一下最大 \(d\) 使得 \(cnt_{d} \neq 4d\)
也即 \(\min(x,y) = d\),通过上述两个方法叠加,我们可以知道此时 \(0\) 可能出现的位置最多只有两个地方,暴力 \(check\) 即可。
因为因数个数大概是 \(\log n\) 级别,所以时间复杂度是 \(O(t \log t)\),加上一些剪枝能跑的更快。

submission

1004E

Tag:结论 树的直径 2400

结论题,没猜出来。
结论就是把直径拉直后,就是直径的一个子段。
证明:考虑一个端点,另一端同理,如果有其他的点可以使得最大值增大,那么它又不是直径,此时直径就会发生变化,与树的直径大小的唯一的相矛盾。
那么就是个很简单的滑动窗口了。

submission

2066B

Tag:结论 2000

首先有两个 \(0\) 就寄了,可以证明答案中要么没 \(0\) 要么 一个 \(0\)
所以我们只需要检验是否能有一个 \(0\) 塞进去即可。
然后最左边的 \(0\) 是最优的,考虑证明
我们考虑两个相邻的 \(0\) ,首先一个 \(0\) 后面的 \(i\) 都是满足条件的,如果不用左边而是用右边的,就会导致中间这一段可能会寄掉,然后对前对后都没有影响。
所以就是一个模拟题了。

submission

2062D

Tag: 贪心 2200

不难发现只有两种本质不同的操作:子树 \(+1\),全局 \(+1\) 然后子树 \(-1\)
我们发现如果父亲节点 \(u\) 比子树都大,那么最后子树都会变成 \(a_u\),我们只需要考虑 \(a_u\) 和儿子 \(a_v\) 的关系即可。
\(a_u<a_v\) 那么我们就第二种操作。
接下来我们考虑如何确定 \(a_u\)\(a_v\) 即可。
首先叶子节点我们选择最小值 \(l_u\),因为如果不够我们是可以随意加的。
再考虑其父亲,如果父亲刚好和儿子一样大就不需要任何操作,比儿子小,就会凭空造成全局 \(+1\) 的情况,所以不优。
那么也就是说,我们要尽量使得父亲比儿子大的情况下父亲越小,那么也就是说 \(a_u\) 选择 \(\max{a_v}\) 即可。
如果超出 \(r_u\),就只能选 \(r_u\),最后答案就是 \(a_1+cnt\),其中 \(cnt\) 表示全局 \(+1\) 的次数。

submission

2061E

Tag:状压 2000

考虑我们求出 \(t_{i,w}\) 表示 \(a_i\) 进行 \(w\) 次操作后得到的最小值。
那么我们只需要将 \(t_{i,1}-t_{i,0}\) 先全部装进堆,然后每次取出最大值,再把 \(t_{i,p_i} - t_{i,p_i+1}\) 装到堆里面即可。
然后 \(t_{i,w}\) 可以状压求出来,所以就非常简单了。

submission

2056D

Tag:正难则反 中位数 2200

一直在想正向计数,感觉很难写,结果反向计数非常简单。
考虑到我们去统计不合法的偶数区间,也就是说 \(a_{mid} \neq a_{mid+1}\)
我们枚举 \(x\) ,令 \(\leq x\) 的位置为 \(1\)\(> x\) 的位置为 \(-1\),那么区间和为 \(0\) 的就是不合法区间,很显然可以用前缀和去做。
考虑会重复计数的问题,我们钦定在 \(a_{mid} = x\) 时才计数,也就是说区间必须包含 \(x\) 这个值,那么我们用双指针,保证区间一定有 \(x\) 即可。

submission

2060F

Tag:计数 插板 2200

虚假的 div3 2200。
我们用 dp 求出 \(f_{i,j}\) 表示长度为 \(i\) 时不包含 \(1\) 且长度为 \(j\) 的数量。
很明显 \(i\) 是个 \(\log\) 级别的数。
然后我们枚举长度 \(t\),剩下 \(n-t\)\(1\),等价于把 \(n-t\) 个无区别小球放入 \(t+1\) 个有区别盒子,并且盒子可以为空,球也可以不放完。
我们再新开一个盒子表示没有放的球,那么我们求解 \(g(n-t,t+2)\)
\(g(x,y)\) 表示 \(x\) 个小球要放完的方案数字,那么根据插板法,\(g(x,y)=C(x+y-1,y-1)\)
所以方案就是 \(C(n+1,t+1)\) ,考虑到 \(n\) 较大 \(t\) 较小,所以我们暴力计算组合数即可。

submission

2057C

Tag:线段树 2000

非常套路的题目,首先左右端点一个是 \(mn\) 一个是 \(mx\)
证明也很容易,考虑如果端点既不是最大也不是最小,那么去掉端点答案就会更大。
我们不妨设 \(a_l = mn\)\(a_r = mx\),所以我们要维护 \((a_r-r)-(a_l-l)\) 的最大值,
涉及到单点改,那么就用线段树维护即可,\(a_l =mx ,a_r=mn\) 同理。

submission

2043E

Tag:dfs找环 2300

不是什么很难的题,想出来后代码实现有一点问题,后来想了想改了一种写法。
首先每一位都是独立的,可以分开考虑,问题转化为:
给定两个 \(01\) 矩阵,可以把一行刷成 \(0\),也可以把一列刷成 \(1\),是否能将矩阵 \(A\) 变换成 \(B\)
首先每一行每一列至多操作一次,非常显然。
那么我们讨论如下情况:
\(a_{i,j} = 1 , b_{i,j} = 0\),那么第 \(i\) 行要被操作一次。
\(a_{i,j} = 0 , b_{i,j} = 1\),那么第 \(j\) 列要被操作一次。
然后我们可以发现:
$b_{i,j} = 1 $,那么第 \(j\) 列的操作要在第 \(i\) 行之前。
$b_{i,j} = 0 $,那么第 \(i\) 行的操作要在第 \(j\) 列之前。
考虑根据以上的先后关系建出一张图,那么如果存在一个环并且这个环上有一个必须被执行的操作,那么就无解,
否则一定有解,自证不难,所以我们用 \(dfs\) 或者拓扑排序找环即可。
然后时间复杂度我算了以下是 \(O(T(n+m)^2\log A)\)\(A\) 表示值域,乍看是过不了的,但是 \(dfs\) 会跑不满,可以通过。

submission

2048F

Tag:神奇构造题 2000

感觉很有思维含量。
我们考虑什么时候会出现单色环,也就是找到一个点集,左部点和右部点的数量相同。
同时每个点向另一边连了两条边,这些边颜色都相同。
问题转化为给定一个 \(m\times 2n\) 的矩阵,涂上颜色,使得对于每一个颜色,把任意几行为这个颜色的列并起来,数量大于所选行的数量。
所以有个直观想法就是使得每一行的重叠数量尽量少。
我们考虑第一行这么填 \(1,1,2,2 ..... n,n\)
然后这个时候我灵机一动,忽然想到似乎可以做一个循环位移,这样每个颜色都会产生 \(1\) 的位置偏差增加。
所以循环位移 \(2n-1\) 次即可!
这个时候我就猜想一波 \(m\) 的上界应该就是 \(2n-1\),交一发果然过了。
然后看题解发现是这样求出来的,考虑到总边数是 \(2nm\),每个颜色至多形成一个点数为 \(2n+m\) 的森林,此时边数为 \(2n+m-1\),所以 \((2n+m-1)n \leq 2nm\),得出来 \(m \leq 2n-1\)
误打误撞搞出来的,感觉赛时应该能过,不过这种构造题太妙了。

submission

2040E

Tag:概率期望 2100

水的批爆。
考虑两个操作一组,\(\frac{1}{d}\) 概率跳到 \(fa_{fa_u}\)\(\frac{d-1}{d}\)\(u\) 或者 \(u\) 的兄弟中,\(d\)\(fa_u\) 的度数。
显然 \(u\) 和其兄弟没有本质区别,那么显然一个几何分布,期望为 \(2d\)
硬币的作用就是把 \(d\) 改成 \(1\),所以直接挑 \(p\) 个最大的改即可,用 \(set\) 即可。

submission

2034E

Tag:构造 2200

感觉赛时我应该做不出。
首先可以算出每一列的和是 \(\frac{(n+1)k}{2}\)
所以 \(n\) 为偶数时,\(k\) 不能为奇数。
\(k\) 为偶数时,排列可以进行两两配对。
所以最难的是解决同为奇数的情况。
难点就是可以手玩出一组三个配对的,剩下两两配对。
所以就做完了,感觉这个很难手玩,而且不是很好想。

submission

2001D

Tag:线段树 1900

vp时被卡了的题目,但是最后15min过掉了,特意写题解说下几个教训。

首先做法很简单,答案为数字种类个数。
设我们选到第 \(i\) 个数,那么就是选 \([l,r]\) 中的 \(max\) 或者 \(min\)
\(l\)表示上一个选的数的位置,\(r\) 表示最右端的元素使得 \([r,n]\) 中包含剩下的所有元素。
我们不难发现是可以用线段树,我用的也是这个,但是难写难调。
然后我还在一个地方不小心写成了暴力,警示以后写题要注意某些地方的复杂度。
转变一下思路,\(l\)\(r\) 均是单调的,我们其实只需要用一个 \(multiset\) 即可。
导致最后 perf 只有 1930,如果不吃那么多罚时,perf 大概有 2050 左右,算是渡劫分了。

submission

2072G

Tag:根号分治 整除分块 2200

首先考虑到 \(k\geq \sqrt n\) 时最多只有两位。
那我们就可以把式子写出来 \(\sum_{i=\sqrt n}^{n} \lfloor \frac {n}{i} \rfloor + n \% i \times i\)
拆式子:\(n \% i = n - \lfloor \frac {n}{i} \rfloor \times i\)
所以原式子变为 \(\sum_{k=\sqrt n}^{n} \lfloor \frac {n}{i} \rfloor + (n - \lfloor \frac {n}{i} \rfloor \times i) \times i\)

所以我们实际上只要求 \(\sum \lfloor \frac {n}{i} \rfloor \times i^2\) 即可。
很显然可以预处理 \(i^2\) 的前缀和后整除分块。
然后对于对于 \(k \leq \sqrt n\),直接暴力计算即可。
时间复杂度 \(O(T\sqrt n \log n)\)

submission

2031E

Tag:树形dp 2200

\(f_u\) 表示以 \(u\) 为根时的最小深度。
我们考虑儿子数量大于 2 时,需要合并两个儿子,直到只有两个儿子。
\(u,v\) 合并成新点 \(w\)\(f_w=\max(f_u,f_v)+1\)
显然是挑选两个 \(f\) 最小的点即可,用 \(multiset\) 实现。

submission

2035E

Tag:根号分治 整除分块 2300

我们设 \(1\) 操作用过 \(a\) 次,\(2\) 操作用过 \(b\) 次。
所以答案就是 \(\min\{ax+by\}\)
然后有一个结论:\(y\) 可能的值是根号级别的。
首先我们肯定是做 \(\lfloor \frac{a}{k} \rfloor\) k 加操作,中间夹杂 \(2\) 操作。
\(a\) 大于 \(\sqrt z\) 的时候,\(y\) 最多也是根号级别。
\(a\) 小于 \(\sqrt z\) 的时候,\(y\) 可能的值和 \(a\) 的范围相同。
所以我们把每一段的 \(y\) 值找出来,然后用最小的值就可以了。

submisson

2005D

Tag:数论 二分 2400

考虑到前缀 \(gcd\) 的数量只有 \(\log\) 个。
我们先枚举 \(l\) , 那么求出每一段的断点。
然后对于后缀也求一遍,那么我们把所有断点装进一个 \(set\)
然后整段的统计即可。
时间复杂度 \(O(n\log ^ 2 n)\)

submission

2005E2

Tag:DP 博弈 2500

我们设 \(f_{k,x,y}\) 表示在第 \(k\) 轮时在 \((x,y)\) 为左上角的矩形时,是否能取胜。
而取胜是的条件就是可以跳到一个必输点。
要么就是跳到边界,要么就是跳到数组用完,要么就是跳到 \(f_{k+1,x',y'}\) 使得 \(f_{k+1,x',y'} = 0\)
不难发现如果 \(f_{k+1,x',y'} = 0\) 时,整个以 \({x',y'}\) 为左下角的矩形的对应的 \(f\) 的值都为 \(1\)
经过推理我们可以发现这是一个上三角矩阵,我们不妨设 \(g_{k,i}\) 表示第 \(k\) 轮时 \(i\) 行最右边的 \(1\) 是哪个位置,然后转移即可。时间复杂度是 \(O(nl)\),可以通过本题。

submission

1988D

Tag:树形DP 2000

结论是游戏的轮数最多是 $\log n + 1 $ 轮。
我们会发现这个过程很像点分治,只是这是删除多个点。
我们讨论两种情况:重心被删除了,那么这次分裂没什么问题。
如果重心没有被删除,则重心的一个相邻节点一定会被删除,然后假设重心与其他子树断开,其他子树相当于是规模相同的子问题。
我们会发现一个共同点:如何删不删重心,我的每个子树都会自发的进行删除,所以重心的存在是不需要理会的。
所以我们考虑一个 dp:设 \(f_{i,j}\) 为以 \(i\) 为根节点,选择在 \(j\) 时刻删除的最小值。
所以 \(f_{i,j} = \sum_{k \in son_i} g_{k,j}\)\(g_{i,j}\) 表示 \(i\) 不选择 \(j\) 时刻删除时的最小值。
时间复杂度 \(O(n\log n)\)

submission

1988E

Tag:单调栈 二分 数据结构 2300

不是很难的数据结构,考虑把初始答案先求出来。
第一,如果以 \(i\) 为端点的区间,要减去,我们在做单调栈的时候可以动态考虑这一部分。
第二,求出 \(L_i\)\(R_i\) 之后,要减去 \((i-L-i)\times(R_i-i)\times a_i\)
第三,考虑在 \(a_i\) 被去掉后,有些 \(value\) 可以 "咸鱼翻身" ,我们把 \(R_i\)\(L_i\) 相同的装进一个 \(vector\)
我们还需要处理出 \(tor_i\) 表示 在跨过 \(r_i\) 后第一个比 \(i\) 小的数在哪里。
所以我们只需要加上 \((x-ls)\times(tor_i-i-1)\) 即可,\(ls\) 表示在 \(vector\) 的上一个位置是什么。
然后求出 \(tol_i\),计算方法同理。
时间复杂度 \(O(n\log n)\)

submission

1977D

Tag:hash 2300

不是很配2300,考虑每一列可以成为特殊序列的方案数级别是 \(O(n)\) 的。
那么总状态数是 \(O(nm)\),开个 map 然后 hash 即可,弱智题。

submission

1982E

Tag:计数dp 2300

\(f_{i,j}\) 表示位数小于等于 \(i\) 位时,\(1\) 的个数小于等于 \(j\) 的总区间个数。
很显然 $ f_{i,j} = f_{i-1,j-1} + f_{i-1,j} $ 。
然后 $f_{i,k} = $ \(i\) 以内所有的区间数,其中 \(k \geq i\)
然后对于第 \(i\) 位和第 \(i-1\) 位的交界处,只有 \(f_{i,i-1}\) 会受影响,特殊计算一个即可。
那么 \(ans_{i,j} = f_{x-1,j} + ans_{i',j-1}\),其中 \(x\) 表示 \(i\) 的位数。
\(i'\)\(x\) 去掉最高位后的数。
然后把 \(ans_{i,j}\) 的求值过程写成一个 \(dfs\) 即可。

submission

1174F

Tag:树链剖分 交互 2400

因为是往下拉一条链,可以联想到树链剖分。
首先如果 \(s\) \(u\) 得到的点不是 \(u\) 的重儿子,那么直接走。
查询重链上同深度的点与其的距离,就可以得出其 \(LCA\),然后此时就一定会走轻儿子。
然后这题有个很坑的点就是,如果重链的深度很浅,那么就只能问链底了。

submission

2049E

Tag:二分 交互 2300

我们先询问 \([1,n/4]\)\([n/4+1,n/2]\)
如果答案相同,证明 \(1\) 在右半边,否则 \(1\) 在左半边。
然后二分 \(k\) 即可。

submission

posted @ 2025-02-20 14:45  Isenthalpic  阅读(8)  评论(0)    收藏  举报