P11367 [Ynoi2024] 魔法少女网站第二部 题解
一些字打了又删,犹豫再三也没把老年选手的碎碎念放出来,无病呻吟应该是没人愿意看的。
以下视
考虑分治,处理跨过分治中心
思考一下这个来回跳的过程,大概就是先在一边跳一会,然后跨过
显然只有右边排序后
-
若左侧不存在
k 满足a_i<a_k<a_j ,则我们会直接从a_i 跳到a_j ,答案贡献距离为c_0=|i-j| 。 -
否则会从
a_i 跨过\text{mid} 跳到左边,不知道跳多少次再跳回到a_j ,只算右边的贡献是c_1=i-mid+j-mid 。
所以我们需要计算所有点对
以上都是暴力,考虑如何用数据结构维护这个过程。考虑到点对
我们发现修改和查询存在不平衡,考虑使用
考虑线段树即可视为
回到上面的问题,我们有
看起来大部分人都能轻松通过,但我被卡了好久的常,所以在这里说一下我的卡常方法:
-
加快读,少开
\text{long long} ,没询问就不要跑这一大坨。 -
扫描线建议按询问排序扫,扫完所有询问了即使后面还有点对需要删就可以不用额外加点对了,访问链表顺次删除贡献即可。
-
-
递归到底层可以跑暴力,我设的阈值为
\text{len}\le 65 ,瞎试出来的,其实可以跑一下看看分治长度都有哪些。 -
随着分治区间长度不同,一维数点的值域大小不总是
n 。随着分治区间减小可以缩小维护范围,能小一些常数。 -
当分治子树内总询问数不超过某阈值,可以直接将内部排序跑暴力。我试过没有显著效果,但如果卡不进去可以试试。
-
能加
\text{inline} 就加,有效果。 -
洗把脸多交几次就过了,亲测有用。
需要代码的可以私信我,但我写的一坨屎,还是别来找我污染你数据库了吧。