2024.1.14 比赛+题选

Partitioning the Array

source:cf1920C

题意:将一个序列等分成 \(k\) 段,使得 \(k\) 段在 \(\bmod m\) 意义下相同。求满足条件的 \(k\) 的个数

Sol:易知,\(k|n\),所以 \(k\le 2\sqrt n\)。我们可以用 \(O(\sqrt n)\) 的时间枚举 \(k\)

考虑 \(a_1,a_{k+1},a_{2k+1},\cdots\) \(\bmod m\) 同余,则令其从小到大排列的情况下,\(\forall a_{k+i}-a_i \bmod m=0\)。题目要求,\(m\ge 2\),所以我们对于所有的 \(a_{k+i}-a_i\)\(\gcd\),判断其是否等于 \(0\) 即可。

Array Repetition

source:cf1920D

题意:对一个初始为空的序列有两种操作:添加一个数 \(x\) 在其尾端,复制其本身 \(x\) 遍。有 \(m\) 个问询,求在最终的序列中第 \(k\) 个的值(序列超过 \(10^{18}\) 的部分无需考虑)

Sol: 题目的难度在于破解“复制”这个条件,我们对于序列的第 \(k\) 项,只需要找出这一项是前面哪一项的复制即可。

例如在 1 2 1 2 3 1 2 1 2 3 中第九项,应该理解为第四项的复制。第四项,是第二项的复制。由于第二项是通过操作一得到的,所以不需要再递归下去。

容易发现,在上述递归过程中,每一次递归所考虑的元素下标一定减半。而大于 \(10^{18}\) 的项不需要被考虑,所以每一次询问所需的递归次数不会太多。

可以用一个 map 维护第一种操作带来的值,并记录每一个第二种操作在最后数组中的区域(例如上例中在 1 2 1 2 3 后,进行一次复制,则这次操作的区域为 \([6,10]\))所以在递归时二分这个区域,然后取模后记叙递归直到由第一次操作带来即可。

所以时间复杂度为 \(O(n+q\log k\log n),k=10^{18}\)

Counting Binary Strings

source:cf1920E

显然,我们考虑两个 1 之间的下标差(为 a 数组),则可以转化问题为

求 a 的数量,满足

  • \(a_i\ge 0\)
  • \(\sum^{m-1}_{i=1} (a_i+1)\times(a_{i+1}+1)=n\)
  • \(\forall 1\le i < m,a_i+a_{i+1}+1\le k\)

Sol:\(f_{i,j,p}\) 表示 \(m=i\),合法子串 \(j\) 个,\(a_m=p\) 的情况,枚举最后两个转移。时间复杂度 \(O(n^3)\)

显然,枚举 \(m\) 是多余的,然后关注到 \(jp\le n\),调和级数分析,总复杂度为 \(\mathcal O(n^2\log n)\)

冻土丘陵

source: unpublished

题意:给定一个 \(n\times m\) 的棋盘格,初始在每个格子上都有若干棋子,两人轮流操作,无法操作者(即棋子全部在 \((n,m)\) )输。操作方式是:选择一个格子 \((x,y)\),将这个格子中至少一个棋子移到 \((x+1,y)\)\((x,y+1)\) 中的一个。多测,\(n,m\le 1000,T\le 10\)

Sol: 可以联想到一维的移棋子问题,那个的必胜条件是 将离终点距离为奇数的每一堆棋子个数 xor 起来,所以可以猜这道题的结论是 \((n,m)\) 哈曼顿距离为奇数的每一堆棋子个数 xor 起来

证明如下:

将格子按照到重点的距离分成两类。将重点格子奇偶性的染黑,反之染白。每一次移动,对应数量棋子颜色取反。最终状态必然是所有棋子都是黑色。所以可以将白色棋子看作 \(nim\) 游戏。

关于输入量

输入量 \(= Tnm\) 个 int,也就是 \(10^7\) 个 int,用 cin 会被卡常。

蓝鲸

source: unpublished

题意:区间 \(\gcd\),区间赋值,$ n,q\le 10^5$

Sol:易知 \(\gcd\) 具有合并性,可以用线段树维护。看到区间赋值,基本的思路是区间懒标记延迟下传。有点卡常。时间复杂度 \(O(m\log n \log A)\)

溜冰场

source: unpublished

题意:一个棋盘格,每个格子有水泥地、冰两种可能。只有冰上可以走,往某一个方向必须走到第一个水泥地(或者边界)。求最少得增加多少格水泥地可以使得从任意格子开始都可以经过棋盘格中的所有格子。

Sol: 我们发现,你经过水泥地的时候,可以不变向。所以,我们将每一行每一列理解为一条轨道线路,每一个格子就是一个站点,但只有水泥地可以换乘(从行到列,或反之)

那么,发现从任意节点出发一定可以到 \((1,1),(1,m),(n,1),(n,m)\) 四个节点,所以题目条件转化为 \((1,1)\) 可以到所有节点所需要几块水泥地。所以所有的行都联通,或者所有的列都联通。

那么你把水泥地带来的“换乘“效益用并查集维护,答案也就是 \(\min(横联通分量,纵联通分量)-1\) 的个数。

超级钢琴

source NOI2010

题意:有 \(n\) 格音符,美妙度分别为 \(a_1,\cdots,a_n\),找到 \(k\) 段连续段,使得每一段的长度都在 \([L,R]\) 范围内,求美妙度和。

Sol: TBD,因为还没完全理解

枚举

source lxl round

题意:\(N'=(((N^2+1)\bmod a)+n)\bmod c\),给定 \(N,N'\),求 \((a,b,c)\) 满足 \(1\le a,c \le P,0\le b \le P\)。输出三元组个数和字典树最小的 \(10^5\) 个三元组。

Sol:

  • 发现枚举三个的复杂度是 \(\mathcal O(P^3)\),非常不可取。
  • \(N_2\) 的取值个数非常有限,可以逆推出 \(N_2\) 和对应的 \(c\),同理得到所有 \(N_1\) 的取值和对应的 \(a\)。对每个 \(N_1\) 的取值可以而分出合法的 \(N_2\) 个数和对应方案。时间复杂度 \(\mathcal O(P^2\log P)\)
  • \(\lfloor \frac{N_2}{c} \rfloor +N_3=N_2\),求 \(N_1\) 的取值可以按照上一条方法计算。调和级数发现 \(c\) 的取值至多只有 \(\mathcal O(P\log P)\) 种取值。然后二分前缀和可以得到 \(b\)
posted @ 2024-02-29 14:59  wtcqwq  阅读(15)  评论(0)    收藏  举报