CF

CF2138 (Round 1048 Div. 1)

20250908

CF2138A

正难则反。注意到到达状态 \((x,y)\) 的方案在 \(x\neq y\) 时唯一确定,我们只要倒推到 \(x=y\) 就好了。

CF2138B

fun fact:赛时几乎所有人都对着错误的题面想出了正确的做法 /xk

因为只有恰好一次使用 \(2\) 操作的机会,所以如果出现 \(3,2,1\) 这样的情况就不合法。

然后维护 \(pre,nxt\) 表示 \(2\) 前第一个 \(3\)\(2\) 后第一个 \(1\) 的位置,然后维护 \(R_i\) 表示 \([l,r]\) 合法当且仅当 \(r\leq R_l\)

CF2138C1,C2

注意到最优方案是让 \(lcs\) 是根到某一层的连续路径。

然后相当于做一个背包。

无脑做法是每做一层都判断一下当前背包是否合法,复杂度 \(O(\frac{n^2}{w})\),已经可以通过 C2。。

进一步思考,设 \(m=\min_{i\in leaf}dep_i\),则 \(ans\in\{m-1,m\}\)

所以只要背包做到 \(m\) 的时候判定是否合法即可。

然后可以不断二进制分组做到 \(O(\frac{n\sqrt{n}}{w})\)

CF2138D

狗屎。说白了就是分类讨论。一直分类讨论。

拆贡献。求出每个位置的答案。

然后考虑把操作分类。然后找出每一类的个数,组合数算一下。

问题在于移动要算的位置的时候,需要快速计算每一类,一大坨细节。

CF2138E1

垃圾题。喜欢用线性代数知识考人。。

看到每行每列不能超过 \(3\),可以考虑带状矩阵构造。

有结论是,带状矩阵的行列式计算是递归的。同时只能用 \(0,1,-1\) 意味着 \(\det\) 的递推只有简单的 \(a\gets a\pm b\)

然后在此基础上推一下。考虑 \(a_i\) 表示 \(i\times i\) 的左上角子矩阵的 \(|\det|\)

然后考虑一种构造:\(a_{i-1}=|a_i-a_{i+1}|\)。注意到这样可以和一种合法 \(\det\) 序列对应。

然后枚举 \(a_m,a_{m-1}\),可以递归地向前构造。

可能构造不出来。多随机几次 \(a_{m-1}\)

CF2147 Global Round 29

20250921

A,B,C 略。

CF2147D

首先要注意到的是:两个人的总分不变。

然后注意到一个数如果出现偶数次,那么两个人可以拿到相同的分数。

如果一个数出现奇数次,那么谁先抢到就可以得到分,然后变为偶数次。

于是就是贪心抢最大的奇数次的值。

CF2147E

考虑操作怎么加速。注意到答案一定是把 \(\operatorname{OR}\) 的一个前缀中的 \(0\) 变为 \(1\)

然后枚举这个前缀的长度,然后从高到低考虑每一位 \(t\)(包括 \(\operatorname{OR}=1\) 的位)。考虑每次我们会把 \(a_i\gets 2^t\)

如果有一个未选择的 \(a_i\) 的第 \(t\) 位是 \(1\),那么这一位不要代价,否则每一位可以选择一个未选择的 \(a_i\),然后选择这个 \(a_i\),然后代价是 \(2^t-(a_i \operatorname{AND} (2^t-1))\)。可以发现,对于更高的位 \(t\),如果需要代价,且找得到没有用到的 \(a_i\),且,一定优先匹配最大的 \(a_i \operatorname{AND} (2^t-1)\)

CF2147F

同时考虑 \(p,s\) 比较困难。但是如果 \(p=1,\cdots,n\),那么维护是很简单的。可以简单使用线段树解决。

然后我们用线段树维护 \(s'=p^{-1}\circ s\)\(s'\) 就好了。

然后修改 \(p,s\) 是简单的。

CF2150 (Round 1053 Div. 1)

20250924

惊险翻盘。

A 略。

CF2150B

被硬控 20min。。。什么水平。。

仍然是从小限制考虑,推出更大的性质。 我们考虑左右上角一定会被选择。

然后对于最大的那两个 L 限制,其余部分一定不会被选。

于是我们可以顺利推出 \(2\times 2\) 的 L 限制一定是纵列的那两个选一个。

同理,一直推到后面,可以得出,第 \(i\) 列的前 \(\min(i,n-i+1)\) 行有恰好一个黑色,并且后面的行全白。

然后考虑计数。考虑限制最紧的,也就是中间那行,然后向上递推求解。

CF2150C

往贪心思考就是输。

考虑直接 dp。我们考虑 Alice 选择了一个前缀,然后决策当前位置是否被 Bob 选。如果 Bob 选,那么后面 \(j>i,rk_j<rk_i\) 的位置全部都不能选。

于是直接 dp。设 \(f(i,rk)\) 表示 dp 到 \(i\),对于 \(rk_j<rk\) 的已经被钦定选不了的最大答案。

然后转移可以一位一位转移。用线段树维护。

CF2150D $^?$

太难蚌。

考虑枚举最后缩成的长度,而不是先拆贡献。。

考虑缩成长度为 \(k\),然后枚举左右两侧的奇偶性 \(x,y\),有:最后缩成的每一段的长度 \(f(i)=2g(i)+1(1<i<k),f(1)=2g(1)+x,f(k)=2g(k)+y\)

然后就是有 \(S=\frac{n-x-y-k}{2}\) 个位置,可空插板,方案数就是 \(cnt=\binom{S+k-1}{k-1}\)

然后考虑一个位置的方案和,我们发现每个位置地位相同,所以答案是 \(cnt\times suma\times(\frac{2S}{k}+1)\)。这里 \(suma=\sum_{i=1}^{n-k+1}\sum_{j=0}^{k-1}{a_{i+j}}\)

预处理前缀和,然后枚举 \(k,x,y\),复杂度线性。

CF2150E1/E2

交互。一个想法是,考虑对位置分治,随机把 pos 分成两半,然后如果一个数同时出现在两侧,就直接忽略,否则向出现的一侧递归。

然后发现连 E1 都过不去。考虑卡一下常数,我们发现第一次递归,我们只要递归到满足 \(|pos|-ok=2cnt-1\) 的一侧就可以了。其中 \(ok\) 是出现两次的,\(cnt\) 是递归进去处理的数的个数。

然后顺便也能过一下 E2。

CF2152 (Round 1055 Div. 1 + 2)

20251003

A,B,C,D 略。

CF2152E

最后一步构造假了一下。有点唐。

脑电波。注意到没有限制一次查询的个数,我们不妨第一次查询全局的,可以得到一个前缀最大值序列 \(A_1\)

然后考虑接下来每次扣掉之前在前缀最大值序列里的数,然后查询剩下所有的,得到新的前缀最大值序列 \(A_i\)

考虑此时,如果有一次询问返回了 \(\geq n+1\) 个数,那么直接得到答案。

否则返回了 \(\leq n^2\) 个数,找到最后一个不在之前序列中的位置,考虑从这个位置开始构造。

我们从 \(A_n\)\(A_1\)\(pos\) 的前驱 \(pre\)(显然 \(a_pre>a_pos\)),并且让 \(pos\gets pre\)

显然一定可以找到 \(pre\)。然后做完了。

要注意的是,选择 \(a_1,\cdots,a_n,a_x\),其中 \(x\) 是第一个不在之前序列中的位置 是错的

CF2152F

我们设 \(to_i\) 表示最小的满足 \(a_j>a_i+z\)\(j\)

考虑贪心。我们首先贪心地令 \(p_1=l,p_2=l+1\),然后考虑 \(p_3\)。显然有 \(p_3=\max(p_2+1,to(p_1))\)

我们观察 \(p_1,p_3,\cdots p_{2k+1}\)\(p_2,p_4,\cdots p_{2k+2}\) 构成的路径,显然两条路径是交错的。

然后考虑如果直接贪心令 \(p'_k=to(p'_{k-2})\) 会怎样。我们发现,这样可能会出现 \(i\) 使得 \(p'_i=p'_{i+1}\),在两条路径上的表现就是,在 \(p'_i\) 处开始,路径重合了。

直接贪心有倍增做法。我们拓展一下,考虑建一个大的倍增表,每大跳一步表示从 \(p_1\) 跳到路径一开始重合的位置。同时记录实际正常跳了几步。

然后在这个位置,根据推导,我们有 \(p'_{i+1}=p'_i+1\),于是这个又变为一开始的情况。于是可以正确处理大倍增表。

查询的时候,先尽可能大跳,大跳完,此时怎么跳都不会让路径重合,所以接小跳。

复杂度根据实现是 \(O(n\log n)\)\(O(n\log^2 n)\)

CF2152G

树剖好啊。

我们要维护的是,一个点当前/连着子树被翻转后是否会成为叶子。

注意到修改 \(x\) 的子树,除了子树内的标记,会影响到的只有 \(x\) 颜色为黑/白的最近的祖先。

于是直接大力树剖。要维护的就是区间翻转,区间内颜色,区间叶子个数,区间颜色翻转后的叶子个数。

复杂度 \(O(n\log^2 n)\)


当然,存在 \(O(n\log n)\) 的做法。

我们考虑一个黑点,如果被算作叶子,当且仅当子树内只有它一个黑点。

我们考虑用欧拉序来刻画这个限制。考虑进入白点时的值是 \(0\),出来是 \(1\),黑点是 \(2,3\)。那么答案就是 \(2323\) 子序列的最长长度的一半。

然后线段树用脚维护。

CF2152H1H2 $^?$

能做出 H2 是不是当且仅当用题解的方法做出 H1。

考虑找到满足要求的 \(S\) 的必要条件。不妨设 \(w\) 互不相同。

首先 \(S\) 要联通。我们发现,如果 \(\max_{e\in cut(S,U-S)}w(e)>\min_{e=(u,v),u,v\in S}w(e)\),那么我们把 \(S\) 按照 \((u,v)\) 断开,然后把存在左侧 \(\max\) 的一端删除,答案一定变小。正确性显然。

于是我们找到所有满足要求的 \(S\)。我们发现,这样的 \(S\) 只有 \(O(n)\) 种。

类似 kruskal 的,我们把边按照从大到小排序。一个包含边 \(e=(u,v,w)\)\(S\),一定会包含相邻的 \(w\) 更大的 \(e\)。所以是 \(O(n)\) 种。

求出之后,建出重构树,就可以直接 dp 了。这样可以通过 H1。

观察转移式,这是经典 slope trick。于是直接上堆维护。当然线段树也可以。

复杂度 \(O(n\log n)\)\(O(n\log n\log V)\) 之类的。反正 3s 怎么写都能过 H2。


其他做法存在可以过 H2 的吗。

CF2145 (Edu Round 183 Div. 2)

A,B,C 略。

CF2145D

正难则反卡了几分钟。

考虑正难则反,那么 \(rev=0\) 的就是不降子段。不降子段的计数是容易的,我们把序列按照 \(a_i>a_{i+1}\) 划分。不降子段就是不跨过划分的子段。注意到我们只关心划分间的段长度构成的可重集。

所以分拆数复杂度的 dfs 即可。其实不需要 dp。

CF2145E

线段树上二分板子题。考察点是你有没有学过。

然后我写错了。。线段树上二分可能需要记录前驱的贡献。。特别是前缀有关的信息维护。

实现可以区间加,单点二分。也可以单点修改,带记录前驱的二分。

CF2145F

首先需要注意到 \(M=\operatorname{lcm}(1,2,\cdots,10)=2520\) 是比较小的。

  • 唐唐矩阵快速幂优化 dp 做法:

于是我们把格子每 \(M\) 个分段,这样两段的障碍是相同的,只有起始时间不同。

于是我们令 \(w(i,j)\) 表示:第一次进入当前段的时间 \(\bmod n=i\),出的时间是 \(\bmod n=j\) 的步数。

然后使用矩阵快速幂加速,复杂度是 \(O(T(n^2M+n^3))\)。当然也有其他复杂度的实现。

  • 正解

注意到 \(a>1\),也就是相邻的两个位置不会同时出现障碍。

于是从 \(i\to i+1\) 格子,只要能走就贪心走,一定是最优的。不会出现无论如何都要在障碍上的问题。

于是 \(-1\) 当且仅当一个位置每次都会有障碍。

考虑直接模拟。我们记录 \(t,pos\) 表示经过的步数,当前的位置。

如果之前经过了一个 \(t'\equiv t\pmod n,pos'\equiv pos\pmod M\),那么这一段就是一个循环。此时可以直接计算得出中间的步数。

如果 \(pos'=pos\) 就无解。

然后最后一段继续模拟。

复杂度:\(O(TnM)\)

CF2145G

唯一难点在于读题。

注意到是每次操作一行一列,可以覆盖,所以我们倒着想,这样每种颜色相当于选择 \(x\)\(y\) 列,然后删去,代价是 \(x+y\)(第一种颜色特殊处理)。问每种代价和的方案数。

于是枚举最后剩下 \(x\)\(y\) 列,于是前 \(k-1\) 行的方案数是把 \(n+m-x-y\) 行、列非空划分成 \(k-1\) 组,每组组内无顺序,组间有顺序的方案数。

也就是 \(\displaystyle\binom{n}{x}\binom{m}{y}\begin{Bmatrix}n-x+m-y\\ k-1\end{Bmatrix}(k-1)!\)

代价是 \(n-x+m-y+\min(x,y)\)

直接算即可。复杂度平方。

如果求的是总方案数,则可以做到 \(O(k\log(n+m))\)

CF2159 (Div. 1)

CF 弄 weak pretest 的出题人,你 * 什么时候 * 啊。Div. 1 能不能 ban rating < 2100 的出题人啊。

~ CF2159A
~ CF2159B
~ CF2159C
~ CF2159D1D2

首先感觉转移很困难啊。考虑观察性质。我们考虑一个代价 \(4\) 的转移,可以拆成两个代价 \(\leq 2,<2\) 的转移。代价更大的也是同理。

所以转移的代价 \(<4\)

于是每次转移枚举代价 \(\in[1,3]\)

直接考虑 D2。考虑一个重要的性质是,值域为 \(V\) 的序列,代价是 \(O(\log V)\) 的。

所以对于每个右端点 \(r\),我们发现,\(f(l,r)=v\)\(v\) 相同,\(l\) 是一段区间。我们直接维护每个 \(v\) 对应的区间。

直接二分 ST 表暴力转移做到 \(O(n\log V\log n)\)

好像有更好的做法。。。TODO。。。

posted @ 2025-09-09 23:16  adam01  阅读(86)  评论(0)    收藏  举报