CF 1046 Div.2 解题报告

A

题意:给定两个队上下半场的比分,问是否存在一个进球顺序使得不存在一个队连续进 \(3\) 个球。

还是细节题。(喜)

submission

B

题意:给定一个长度为 \(n\)\(01\) 序列 \(a\),请构造一个 \(n\) 的排列,使得对于每一个长度为 \(k\) 的区间中,最大元素对应的下标 \(i\) 满足 \(a_i=0\)

因为做了 CF2103D 所以想到可以给所有满足 \(a_i=1\)\(i\) 赋的值都小于给 \(a_i=0\)\(i\) 赋的值。

也就是给一个赋一段前缀,给另一个赋一段后缀。

submission

C

题意:定义一个块为长度为 \(i\) 的序列满足序列中所有元素都是 \(i\)。给定一个长度为 \(n\) 的序列,问这个序列中最长的只有块构成的子序列的长度是多少。

很套路,令 \(f_i\) 为考虑到 \(i\) 时,可以取到的最长子序列长度。

分类讨论:

  • 不选 \(i\),有:\(f_i \leftarrow f_{i-1}\)

  • \(i\),维护从 \(i\) 往前数第 \(i\) 个值为 \(i\) 的下标 \(lst_i\),则有 \(f_i \leftarrow f_{lst_{a_i}-1}+a_i\)

维护 \(lst\) 即可。

submission

D

题意:给定平面上 \(n\) 个点,现在有一个坐标未知的目标点,你可以让它沿着坐标轴方向移动 \(D\) 个单位,每次移动后交互库返回目标点与最近的给定点的曼哈顿距离。请在 \(10\) 次询问内找到目标点的初始坐标。保证每个给定点的坐标的绝对值不超过 \(D\)

最遗憾的一题(因为判断错了正负号痛掉 \(1k\) rank)。

因为目标点有多个,这非常难处理,而且我们无法判断方向,这导致我们不能判断在计算距离时坐标的正负号。

怎么办呢?很简单,只要目标点一定在所有可能的给定点坐标的右上就好了。因此先向上移动 \(2D\) 个单位,再向左移动 \(2D\) 个单位,那么目标点就一定在给定点的右上了,令此时返回的距离为 \(k_1\),那么有 \(x+y=k1- \max \limits_{i \in [1,n]}(x_i+y_i) -4V\)

光有和也没用啊,如果还有个差就好了。因此我们向下移动 \(4D\) 个单位,那么目标点一定在给定点的右下,令此时返回的距离为 \(k_2\),那么有 \(x-y=k2-\max \limits_{i \in [1,n]}(x_i-y_i) -4V\)

之后大家都会做了。

submission

E

题意:给定一个 \(n\) 个点 \(m\) 条边的无向图,每一个点有点权 \(a_i\)(保证 \(0 \le a_i < V\)),有些点的点权未知。定义路径的权值为路径上的所有点权的异或和。请给每一个未知的点权分配一个 \(0\)\(V-1\) 之间的值,请问有多少中可能的点权分配方案使得图上任意不同的两点的所有简单路径的权值相等。

首先,只有一条简单路径的点对我们就不考虑了。

其次,如果一个点对之间不止一条简单路径,那么这个点对一定在一个边双连通分量中。

为了降低思维难度,我们先考虑一个环上的情况:

对于环上任意两点 \(u,v\),它们在环上的路径的权值相等。我们在环上找三个点,按顺时针顺序分别为 \(a,b,c\),定义 \(dis(a,b)\) 为环上 \(a\)\(b\) 顺时针路径的权值。那么此时有 \(dis(a,b)=dis(b,a),dis(a,c)=dis(c,a)\),因此我们有 \(dis(a,b) \otimes dis(a,c) =dis(b,a) \otimes dis(c,a) \rightarrow a_c=a_b\) 很神奇吧,所有对于一个环上所有点,它们的点权相等。

在此基础上,我们考虑一个奇环,除非环上所有点的点权为 \(0\),否则无解(长度为偶数的路径的权值一定为 \(0\))。

所有边双连通分量之间互不影响(因此不在一个边双连通分量里的两个点之间一定只有一条简单路径),因此只需要将可能性相乘即可。

submission

F

首先,我们可以输出 \(N\)\(1\),然后我们会得到一个答案区间 \([L,R]\)

若返回值为 \(r\) 的话,那么有:

\[W \in [B*\lfloor\frac{N+r-1}{r}\rfloor,B*\lfloor\frac{N+r-2}{r-1}\rfloor-1] \]

结合询问的实际意义还是挺好理解的。

这里还有一个应用,如果我们已经确定 \(w \le x\),那么我们可以询问 \(x^2\)\(1\),那么保证对于每一个不同 \(w\),返回值不同。

证明如下:(来自 deepseek)

但是这样询问长度还是太长了,所有我们需要一个更优秀的方法。我们继承上述方法的思想,询问 \(N\)\(B\)

接下来我们就要根据返回值进行分类讨论:

  • 对于 \(W \in [1,B-1]\),返回值为 \(0\)。我们就像上述策略一样进行模拟;

  • 对于 \(W \in [B,n]\),返回值为 \(x=\large\lceil\frac{N}{\lfloor\frac{W}{B}\rfloor}\rceil\)。我们可以暴力枚举 \(W\) 的长度,用一个序列 \([L,1,L,2,\cdots,L,R-L]\)。这样的话第二次的询问长度是 \(2 \times (R-L)\)(有一个优化的细节,有效的 \(R\) 不超过 \(10^5\) )。

这样总询问次数为 \(N+\max(B^2,2 \times (R-L))\)

问题变成怎么求 \(N,B\)

观察上述式子发现至少存在 \(N+B^2 \le 2.5\times 10^4\),即 \(B= \lfloor\sqrt{2.5\times 10^4-N}\rfloor\)(\(B\) 越大越好,因为 \(B\) 越大,\(r\) 的最大值就越小)。

枚举 \(N\);当 \(W=10^5\)\(r\) 取最大值。枚举每一个 \(r\) 的取值,并计算对应的 \(L,R\)。求出总询问次数最大值的最小值。

时间复杂度为不超过 \(O(N^2)\)(远远低于这个值) ,可在本地跑完选一组合法解。(共有 \(14840\) 中合法取值)

同时 \(n\) 不能太小,不然可能 \(r\) 就会取到 \(0\) 了。经过计算,我们选择 \(n=11353,B=116\)

跑出 \(N,B\) 的代码

submission

posted @ 2025-08-29 21:16  XiaoZi_qwq  阅读(23)  评论(0)    收藏  举报