2024.10.21总结
本文于 github 博客同步更新。
A:
分讨一下,发现只有 112233
、122331
、123123
这三种,记 \(cnt_1,cnt_2,cnt_3\) 为它们对应的方案数。
先观察第三种情况:三条线段两两相交的情况。
则 \(cnt_3\) 为:至少有一对线段相交的方案数减去只有一或两对线段相交的方案数。
而前两种情况都是没有任何两条线段相交的。
则 \(cnt_1+cnt_2\) 为:没有任何两条线段相交的方案数减去存在一条线段只包含第二条线段,而不包含第三条线段的情况。
用线段树预处理出被每个线段包含和与每个线段相交的线段树,考虑容斥。
三条线段互不相交、存在一条线段只包含一条线段的情况可以通过枚举包含线段的那条线段来处理。
三条线段不全相交的,观察三条线段的三对关系中,正好都是有两条线段,与一条线段相交而与另一条不相交的,所以我们只需要枚举这种情况,最后除以二即可。
时间复杂度 \(\mathcal O(n\log n)\),场上写完 60pts 暴力就跑路了。
B:
由于 \(n,m,p\) 确定后最终状态的石子数就确定了,想到对最终状态计数。
最终状态可以描述成:靠一的连续段 + 空位 + 若干个连续段和空位,其中只有第一个连续段才有可能滚到一,所以 \(p\) 次失败均发生在这一段。
不妨设 \(cnt_i\) 为连续 \(i\) 颗石子且不发生失败的方案数, \(pre_{i,j}\) 为跟位置 1 连续的有 \(i−1\) 颗石子且已经失败了 \(j\) 次的方案数,\(suf_{i,j}\) 表示从 \(n\) 到位置 \(i\) 有 \(j\) 颗石子,且不会滚到 \(i-1\) 的方案数。
不难想到转移式子:
计算答案时枚举第一个连续段的长度即可:
时时间复杂度为 \(\mathcal O(n^2p+nm^2)\),场上边界出了点问题挂成 80pts。
C:
我们设 \(L_0[i]\) 为从起点往左走 \(i\) 的时间不回头的最大收益,设 \(L_1[i]\) 为从起点往左走 \(i\) 的时间并回到起点的最大收益,并类似地定义 \(R_0[i],R_1[i]\) 为往右走的最大收益。
则答案等于 \(\max({R_0[i]+L_1[T−i],R_1[i]+L_0[T−i]})\)。
以求 \(L_0\) 数组为例,若 \(L_0[i]\) 代表的最优情况下走过的离起点最远的点为 \(x\),我们设 \(d[i]=x\)。
一个容易想到的结论是:随着 \(i\) 的增加,\(d[i]\) 离起点的距离单调递增。
考虑使用分治解决此问题:
设我们要求 \(L_0[x]\sim L_0[y]\),\(d[i]\) 的取值范围为 \(l_e\sim r_i\),我们取 \(mid=\lfloor \frac{x+y}{2}\rfloor\),枚举 \(l_e\sim r_i\) 后求出 \(d[mid]\) 的值,然后将 \(x,mid−1,l_e,d[mid]\) 作为参数重复此过程,\(mid+1,y\) 同理。
为了求最大收益,我们还需要维护一个线段树,枚举 \(l_e\sim r_i\) 时也会依次将 \(v[l_e]\sim v[r_i]\) 加入线段树,并查询前 \(t\) 大的金币数和。
总时间复杂度 \(\mathcal O(n\log^2n)\),但是被我 \(n^2\) 极限草过。