zoukankan      html  css  js  c++  java
  • [IOI2015]teams分组(二维数点+单调栈)

    首先可以得到一个(O((S+n)log_2n))的贪心做法。

    考虑到相同的(K_i)可以合并在一起询问,因为(sum K_i leq n)所以不同的(K_i)只有(sqrt n)个,
    然后对于两个人([l_i,r_i],[l_j,r_j])如果(l_i,l_j in [K_i, K_{i+1}))(r_i,r_j in [K_i, K_{i+1})),那么这两个人对于这一次询问是没有区别的。
    这样压缩后,结合上述贪心,复杂度(O(ssqrt n log_2 n))
    正解是考虑直接优化贪心:
    把人看成坐标((l_i,r_i))的点,
    那么对于一个(K_i),它可以选的点,就是以点((K_i,K_i))为右下角的矩形。
    我们先给(K_i)按从小到大扫描线。
    (h_i)表示扫描到(K_i),最优方案下,在((K_{i-1},K_i])最小的(y)没被选的高度,
    (f_i)表示剩下多少个没选。
    考虑加进一个(K),考虑(h_i<K)那么这个(K)能选的,(K_i)一定选不到。
    我们搞一个单调栈,维护下降的(h_i),这时,我们就弹掉它。
    如果(K>=h_i),我们可以通过二维数据结构,求出可选的点数目。
    然后我们要确定这个(K)(h)值。
    考虑先填满自己,如果超出(h[top])那么这个(top)再怎么样也会小于当前的(h),我们把它们两个合并。
    这样就的到了一个(O(slog_2n+nlog_2n))的算法。

  • 相关阅读:
    UVA 10905
    UVA 10859 树形DP
    LA 4794 状态DP+子集枚举
    LA 3695 部分枚举
    UVA 11825 状态压缩DP+子集思想
    UVA 10891 区间DP+博弈思想
    HDU 5239 上海大都会 D题(线段树+数论)
    HDU 5242 上海大都会 G题
    HDU 5241 上海大都会 F题
    P1359 租用游艇
  • 原文地址:https://www.cnblogs.com/zzy2005/p/14000464.html
Copyright © 2011-2022 走看看