板刷 2019~?的省选题

发布时间 2024-01-12 21:55:17作者: lsj2009

看看会不会咕/cf

除非极度不可做题,否则一般都是会写的。

每个题限时思考 \(30\min\),如果有想法可以延长;然后自己写/看题解。

BJOI2019

P5322 排兵布阵

  • \(\color{blue}\texttt{以前做过}\)

比较水的,略。

P5323 光线

  • \(\color{blue}\texttt{以前做过}\)

考虑记 \(f_i\) 为直接穿过第 \(i\) 面镜子的光有多少,记 \(g_i\) 为从第 \(i\) 面镜子反射回来的光有多少。

易得:

\[\begin{aligned} f_i & = f_{i-1}a_i\sum\limits_{k=0}^{\infty} (g_{i-1}b_i)^k\\ g_i & = b_i+g_{i-1}a_i^2\sum\limits_{k=0}^{\infty} (g_{i-1}b_i)^k \end{aligned} \]

核心思想是一道光从上面打下了和从下面打上来,一面镜子能射回去的光是相同的。

然后就做完了。

P5324 删数

  • \(\color{gold}\texttt{想出 50\% 以上}\)

主要是之前做过其弱化版 AGC17C,所以一上来就有想法。

My AGC17C solution

首先观察到的是,这个题和 AGC17C 唯一的区别就是多了全局 \(\pm 1\) 的操作,所以很自然的会去想到维护一个 \(\Delta\) 去描述这个东西。

然后 update 操作就变成了 delete 掉 \(a_p\) 再 insert 进去 \(x+\Delta\),然后最后就是查询 \(n-\text{sum of }(1+\Delta,n+\Delta)\) 的值。

看起来很对,但是有一种特殊情况:

如图,我们的合法区间边界 \([1+\Delta,n+\Delta]\) 向左挪了一点(黑->蓝),然后红线(对应一条线段 \((x-cnt_x+1)\text{-}(x)\))的端点到了边框之外,这时候显然整个红线我们都要 change 掉(因为不满足 \(a_i=n\) 了),但是事实上根据我们上面的做法还是会将其统计进去。

所以我们上面讲了一堆是个假做法。

考虑如何处理,一个比较自然的想法是,每次边框左移时,就把红线 delete 掉;右移时再把红线 insert 进去。

那么这个相对于要支持下面的一个数据结构:

  • 区间修,不会出现负数,查询一个区间内有多少个 \(0\)

考虑到如果一个区间内出现了零,则其必然时整个区间的最小值(因为值非负),所以我们维护一个区间的最小值和最小值出现个数即可,这个是简单的。

然后就做完了,复杂度 \(\Theta((n+q)\log{n})\)