
日记
码力得到史诗级增强。
堆 Link to 堆
给定有 个数的数组 。有 次询问,每次询问给定一个 ,要求进行 次操作。初始有可重集 。第 次操作的流程如下:
- 取出 里最大的数 ,让 加上 ,将 从 里删除。
- 如果 ,将 加入 。
求每次询问过后请输出 的值。
我们先进行 次 1 操作,那样操作顺序就反过来了。然后我们经过一番手模,发现这时 是单调不增的,因为要是有 就直接被取走了。我们可以每次操作用 数组记录每个数的出现次数。维护一个 指针,初始为 。每次询问就直接去模拟:
- 加入的
取出 然后往下暴力找新的 。 - 加入的
直接取 , 不变。
然后直接输出模拟出来的 ,每次询问复杂度 ,总复杂度 。需要 现代硬件上的常数优化。
不让宋佳兴来讲卡常简直可惜了。
列队Link to
我们发现行之间都是独立的,所以我们可以把整个矩阵分成这个样子:
然后我们发现我们需要一个这样的数据结构:支持插入一个数,删除一个数。我们一看:平衡树!!但是太难写了,于是我们决定使用权值树状数组。先把所有的数都置为 。每次删除的时候二分出来第 个 ,将其置为 就是了。然后有加入进来的外来数就用 vector
存下来就是了。
小明的树Link to
我居然能在不看 std 的情况下自己打出来一个实现还算优秀的 AC 代码?
设第 个点在 时刻被点亮。
考虑如果是记美丽的时刻的个数如何做。我们发现一个时刻美丽当且仅当所有未点亮的灯泡形成一个连通块。而如何记连通块个数呢?设第 个时刻时,连通块个数有 个。我们发现连通块个数等于点数减边数。而在时刻 有 个未点亮的点。那么 。我们发现对于边 ,它会对 的 做出 的贡献。那么答案就是最小值的个数,可以用线段树维护。
但是我们的答案并不是记“美丽时刻的个数”。我们设 表示第 时刻亮灯的灯泡的连通块个数。效仿 ,。那么显然,边 会对 的 造成贡献。
我们用线段树维护: 的最小值; 最小值的个数; 是最小值的位置的 的和。那么边的变化就是对 的区间加减。直接维护就行了。
后日谈 Link to 后日谈
其实黑题也没那么难哈。
日记
© 伊埃斯 | CC BY-NC-SA 4.0