2024.10.10 总结


A:

赛时发了什么疯非要来冲这题。

不妨计各种颜色的宝石为 0/1。

考虑记前缀和的最大值为 SmaxS_{max},最小值为 SminS_{min},于是总的限制为 SmaxSmink|S_{max}-S_{min}|\leq k

考虑反向维护这个限制,即枚举一个 ii,然后钦定 iSminSmaxi+ki\leq S_{min}\leq S_{max}\leq i+k,计算对应的序列个数。然后考虑一个实际差值为 Δ=SmaxSmin\Delta=|S_{max}-S_{min}| 的序列,会被统计 kΔ+1k-\Delta+1 次。记 calc(k)calc(k) 为上述过程计算出的序列个数,于是有最终答案为 calc(k)calc(k1)calc(k)-calc(k-1)

考虑 calc(k)calc(k) 如何计算。考虑把一个 00 看做是在平面直角坐标系上让 xx 坐标 +1+1,一个 11 为让 yy 坐标 +1+1,于是问题转化为,从 (0,0)(0,0) 出发,任意时刻在 y=x+iy=x+iy=x+i+ky=x+i+k 之间,每次可以向右或向上走一步,问走到 nn 的方案数。

我们考虑条件为不能经过 y=x+i1y=x+i-1y=x+i+k+1y=x+i+k+1。我们记一次经过第一条直线的事件为 AA,第二条直线为 BB,我们考虑对形如 AABABBBAAABABBBA\cdots 的前缀做容斥。

我们把所有 AA 合并在一起,所有 BB 合并在一起,变成 ABABAABABA\cdots,然后一次经过 AA 可以用经典卡特兰容斥理解为沿着 y=x+i1y=x+i-1 翻折。

同理 ABAB 即为先沿着 y=x+i1y=x+i-1 翻折,再沿着 y=x+i+k+1y=x+i+k+1 翻折,我们减去翻折了奇数次的结果,加上翻折了偶数次的结果,即可得到最后答案。

B:

签到题目。

考虑到当前点最多从前一百个点转移(di100d_i\leq100),将式子放进矩阵里加速就行。

复杂度 O(d3 logk)\mathcal O(d^3 \ log k)

C:

没有这题。

D:

开场觉得是个简单扫描线,写完 A 之后发现假了,不过绑包了居然没爆蛋(?

题解说这才是签子,没看出来。

不过正解还是扫描线。

考虑对每种活动区间 [l,r][l,r] 增加两维 l,rl',r' 分别表示移除左边界挡板和右边界挡板之后的活动范围为 (l,r)(l',r)(l,r)(l,r')。那么两个区间 (l1,r1,l1,r1)(l_1,r_1,l_1',r_1'),(l2,r2,l2,r2)(l_2,r_2,l_2',r_2') 能够同时坐人当且仅当 l1r2l_1\ge r_2'l2r1l_2'\ge r_1

由于不同的区间最多只有 4n4n 个,于是可以直接扫描线+set 维护找到。将所有区间按 rr' 排序,记录 fi/gif_i/g_i 表示考虑了前 ii 个区间,此时最多能坐多少人,并且在坐最多人的基础上最小的 rr,那么对于某个区间 (l,r,l,r)(l,r,l',r') 有转移:

(fr,gr)(fl+1,r) if (gll)(fi,gi)(fi1,gi1)(f_{r'},g_{r'})\gets(f_{l}+1,r)\ \text{if}\ (g_l\le l')\\ (f_i,g_i)\gets (f_{i-1},g_{i-1})

时间复杂度 O(nlogn)\mathcal O(n\log n)


然后就去体活了(喜,但是打球的时候很饿所以恼了。