不知名某题题解

题目简述

现在你有\(n\)个点\((x_i,y_i)\),我们可以选择任意诺干个点,让这些点组成一个序列。使得序列内点的\(x,y\)均单调增加。

问有那些个点,使得在点集中删去这个点后,可以组成的最长序列的长度下降

思考

整体上思考:我们考虑先计算最长的序列长度,和经过每个点的最长的序列长度。然后判断这两个是否相等。诺相等,则这个点满足要求。

我们考虑先跑一遍拓扑最长路。

我们考虑以下转移顺序。

\((x,y)\)往上可以走到\((x',y')\) 那么必然要满足\(x'+y'>x+y\)

那么我们转移的顺序就是按照\(x+y\)来转移,\(x+y\)大的先转移。

暴力做法的单次转移复杂度是\(O(n)\)

我们考虑怎么优化这个过程。

问题就转化为我们需要一个方法,维护一个三元组。\((x,y,w)\), 查询所有的\(x>x',y>y'\)的三元组中最大的\(w\),支持插入,查询,不支持修改

我们考虑动态开点线段数。每个结点代表一个\(x\)的区间。然后我们要在每个结点上维护\(y,w\)

我们显然有一个结论,就是对于一个确定的\(x\)区间,有两个\((y,w)\)信息,诺存在\((y_1>y_2)且(w_1>w_2)\)那么\((y_2,w_2)\)就没有意义了。这是一个类似单调栈的思想。

那么显然,我们可以在\(O(log_2V)\)的复杂度内完成一次状态的转移。

然后对于每个点的信息。他最多出现在\(log_2V\)个动态开点线段树的结点内,每个结点至多出队一次,入队一次。

所以动态开点线段树的总维护复杂度是\(O(nlog_2V)\)

但是我们需要记录信息来统计不同路径的个数。这个可以和\(w\)一块统计了。

posted @ 2026-09-05 21:02  txp2025  阅读(3)  评论(0)    收藏  举报