1 条题解

  • 0
    @ 2025-11-5 15:13:14

    关键观察

    操作的本质:

    使用 max 机相当于从两张卡中选出强度更大和花费更大的属性。

    使用 min 机相当于从两张卡中选出强度更小和花费更小的属性。

    这提示我们,最终卡的 (T,W)(T, W) 一定来自初始某张卡的 (Si,Vi)(S_i, V_i),因为每次操作只是传递这些属性。

    可达性条件: 经过分析可以发现,最终能得到一张卡 (T,W)(T, W) 当且仅当:

    存在初始卡 ii 使得 SiTS_i \ge TViWV_i \ge W(因为我们可以通过 min 操作来“降低”属性,但需要有一个足够高的起点)。

    存在初始卡 jj 使得 SjTS_j \le TVjWV_j \le W(因为我们可以通过 max 操作来“升高”属性,但需要有一个足够低的起点)。

    并且这两张卡在合并过程中可以通过某种顺序相遇。

    简化条件: 实际上,可以证明最终能得到 (T,W)(T, W) 的充要条件是:

    存在一张卡 pp 满足 SpTS_p \ge TVpWV_p \ge W

    存在一张卡 qq 满足 SqTS_q \le TVqWV_q \le W

    并且 ppqq 在序列中满足某种位置关系(在最终的括号树中,一个在另一个的子树中,或者它们可以通过某种方式相遇)

    进一步转化: 通过更深入的分析,问题可以转化为:

    将所有卡按 (S,V)(S, V) 排序后,最终能得到的 (T,W)(T, W) 必须满足:存在某个 ii 使得 SiTmaxS1,...,SiS_i \le T \le \max{S_1, ..., S_i}ViWmaxV1,...,ViV_i \le W \le \max{V_1, ..., V_i},或者类似的区间条件。

    算法思路

    预处理:

    将初始卡按 SS 排序。

    维护一个栈,用于找到对于每个位置 ii,左边第一个 VV 值比它大的位置。

    构建可达区域:

    从左到右扫描,维护当前的最大 VV 值。

    对于每个位置 ii,我们可以得到一个矩形区域:[Si,)×[Vi,)[S_i, \infty) \times [V_i, \infty)(,Si]×(,Vi](-\infty, S_i] \times (-\infty, V_i] 的交集?实际上需要更精确的描述。

    检查目标卡:

    对于每个目标 (T,W)(T, W),检查是否存在某个 ii 使得: SiTmaxSiS_i \le T \le \text{maxS}_iViWmaxViV_i \le W \le \text{maxV}_i 其中 maxSi\text{maxS}_imaxVi\text{maxV}_i 是前 ii 张卡中的最大 SS 和最大 VV

    高效实现:

    使用单调栈预处理

    对于每个查询,可以使用二分查找来快速判断

    时间复杂度

    排序:O(NlogN)O(N \log N)

    单调栈预处理:O(N)O(N)

    查询处理:O(MlogN)O(M \log N)

    总复杂度:O((N+M)logN)O((N+M) \log N),可以处理 2×1052\times 10^5 的数据规模。

    • 1

    信息

    ID
    5003
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者