专栏文章

ABC421F题解

AT_abc421_f题解参与者 4已保存评论 6

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
6 条
当前快照
1 份
快照标识符
@miny9p8z
此快照首次捕获于
2025/12/02 10:19
3 个月前
此快照最后确认于
2025/12/02 10:19
3 个月前
查看原文
题意:有一个数组,初始为 [0][0]。有两种操作,一是把当前操作编号 ii 插入到 xx 后面,另一种是求两个数 xxyy 之间的数之和,并把它们删掉(不包括两端)。

正解

因为是有插入与删除,考虑使用链表(单向即可)。查询时,因为 xx 的位置可能在 yy 后面,所以从 xxyy 开始一起往后跳,有一个跳到另一个时结束。代码不放了。(其实是我没写)

歪解

赛场上发现 xx 的位置可能在 yy 后面之后就放弃链表了。然而我不会平衡树。
发现可以使用分块 + 定期重构,不会的左转数列分块入门 6。维护每个数属于的块的编号 locloc,每个块的大小 szsz 与和 sumsum,如果有块的大小大于 2n2\sqrt{n}nn 是当前存在的数的数量)就全部重构。复杂度 O(QQ)O(Q\sqrt{Q}),显然跑不满且 AT 神机。最慢的点 1187ms,完全不卡常。
这个题比较特殊,经常会把一个块删光,所以调一下块长可能会更快,不过我没试。

评论

6 条评论,欢迎与作者交流。

正在加载评论...