2023.8.10 做题记录
ARC107D
题意:给出数 \(N,K\),求有多少有理数可重集 \(S\) 满足以下条件:
- \(|S|=N,\sum_\limits{i\in S} i=K\)
- \(\forall i\in S,i=\frac{1}{2^j}(j\in \mathbb{N})\)
分析:用动态规划求解,设 \(f_{i,j}\) 为 \(N=i,K=j\) 的答案。
由于空集只能通过增加 \(1\) 和将目前元素全部除以 \(2\) 来转化成符合条件的有理数集合,因此 \(f_{i-1,j-1}\) 与 \(f_{i,j\times 2}\) 分别对应以上两种操作。
复盘:遇到关于集合的 dp 可以考虑从集合的构造上进行计数 dp。
AGC004C
题意:给定一个网格图,有些位置已经被涂色。要求构造两个相同大小的网格图,并且在上面涂色,需要保证颜色四联通。满足这两个网格的涂色部分的重合位置恰好是给定的网格图的涂色位置。保证边界上不被涂色。
分析:给出一种构造方案:初始的第一个图和第二个图如下:
####. ....#
#.... .####
####. ....#
#.... .####
####. ....#
再将要求重合的点在对应的图上涂色即可。
复盘:这题一开始做的时候没看到保证边界上不被涂色的条件,所以一直没有构造思路,因此当没有思路时,要回看题目,注意有没有审错题目。
CF1270G
题意:给出 \(n\) 个整数 \(a_1,a_2,\dots a_n\),保证 \(\forall a_i,i-n\le a_i\le i-1\)。
找到这些整数的非空子集,使得它们的和为 \(0\)。
分析:考虑转化所给条件,原条件相当于 \(1\le i-a_i\le n\)。
对于每个 \(i\),考虑将 \(i\) 到 \(i-a_i\) 连边。这时的图是一个基环树内向森林,找到基环树的环即可。
原因:\(i\) 走到 \(i-a_i\) 的过程相当于 \(i\) 减去 \(a_i\),因此走过这个环就可以理解为 \(i\) 减掉若干个数仍为 \(i\),因此这些数的和为 \(0\)。
复盘:神仙题。
关键点在于转化条件后想到建边找环。
这题需要对算法进行充分的了解和掌握,外加灵光一闪才能做,毕竟 tourist 赛时都不能场切。
CF1364E
题意:交互题。
有一个固定长度为 \(n\) 的排列 \(P\),值域为 \([0,n-1]\)。你可以进行不超过 \(4269\) 次询问 \(x,y\),并得到 \(P_x|P_y\),之后要输出这个排列。
分析:不难发现只要找到 \(0\),再通过 \(n-1\) 次询问即可得到排列。
因此问题转化为在 \(n+173\) 次询问中找到 \(0\)。
考虑如何求 \(P_i\) 的确定值:随机一个下标 \(x\),不断询问 \((x,i)\),并将逐次答案相与,如果随机 \(x\) 次,答案算错的概率最坏为 \(11\times 2^{-x}\),在 \(x\) 取一个比较大的值如 \(20\) 时可以忽略不计。
将序列从 \(1\sim n\) 扫一遍,我们钦定每次询问 \((i,cur)\),当 \((i,cur)=P_{cur}\) 时候,显然二进制分解下 \(P_i\) 是 \(P_{cur}\) 的真子集,于是将 \(cur\) 设为 \(i\),容易发现,这一定是 \(P_{cur}\) 不断缩小的过程,而扫一遍后 \(P_{cur}\) 一定等于 \(0\)。
可以将排列事先进行随机,防止出题人构造的极端数据导致询问超出限制。
复盘:算是一道比较经典的交互题,处处体现了交互题中 「随机」 的套路,而又考察了对位运算性质的熟悉程度,是一道非常具有学习意义的题目。
CF1850H
题意:\(n\) 个人,\(m\) 个要求,每个人都站在数轴上的一个整数点上(可以在负半轴上)。
每个要求如下 \(a_i,b_i,d_i\),表示第 \(a_i\) 个人要站在第 \(b_i\) 个人前方的第 \(d_i\) 个位置(如果 \(d_i\) 是负数,则第 \(a_i\) 个人要站在第 \(b_i\) 个人后方的第 \(-d_i\) 个位置,问是否存在满足要求的方案。
分析:考虑对于 \((a_i,b_i)=d_i\),建反向边 \((b_i,a_i)=-d_i\),对于一个连通块,钦定一个点作为初始点,赋予一定的点权并在连通块上进行 dfs 更新点权,如果对于一个点同时出现两种点权即不合法。
复盘:div4 的 H 题,比较板子,差分约束也可以做。
CF1852A
题意:有一个集合 \(S\),初始状态里面有数字 \(1,2,3\dots 10^{1000}\)。
给出 \(n\) 个数 \(a_i\),定义一次操作为:删除 \(S\) 中目前第 \(a_1\) 小,第 \(a_2\) 小,……,第 \(a_n\) 小的数。
要进行 \(k\) 次操作,问集合最后的最小值为多少。
分析:考虑倒推 \(k\) 次操作前的排名,容易发现,一个数的排名在一次操作内都会减少比自身小的 \(a_i\) 的个数,所以双指针维护即可。
复盘:这题困扰我更多的是题解区另类的二分做法,感觉比较奇怪但是又 Hack 不掉,不知道为什么会有单调性/yiw。
CF1073D
题意:有 \(n\) 个店铺呈环形分布,每个店铺都在卖糖果,售价为 \(a_i\),Polycarp 带了 \(T\) 块钱去买糖果,他将遵循以下规则:
- 他从 \(1\) 号店铺开始参观。
- 每当他路过一个店铺时,如果他买得起这个店铺的糖果,他会买一个。
- 无论他买不买糖果,他都会顺时针前往下一个店铺。
如果他一个糖果都买不起,他会离开博览会。
分析:考虑如果他买不起第 \(i\) 个店铺的糖果,他之后也买不了,因此我们直接删除第 \(i\) 个店铺即可。
如果他的钱非常充裕,可以买得起所有糖果,那么直接累加答案直到不能买到所有糖果,重复第一段操作删店铺即可。
一二段的操作单次复杂度是 \(\mathrm{O}(n)\) 的,考虑一二段操作执行的次数。
由于第二段操作是对一个比 \(T\) 小的数取模,因此 \(T\) 至少减半,证明:
- 若 \(sum\le \frac{T}{2}\),\(T \bmod sum < \frac{T}{2}\)
- 若 \(sum> \frac{T}{2}\),\(T\bmod sum=T-sum<T-\frac{T}{2}\),即 \(T\bmod sum<\frac{T}{2}\)
因此执行次数最坏是 \(\log m\)。
时间复杂度 \(\mathrm{O}(n \log m)\)。
复盘:这题难点在于时间复杂度的计算,主要是能学习到取模运算的一个小性质,有助于分析程序复杂度。

浙公网安备 33010602011771号