首页 > 代码库 > bzoj 2527: [Poi2011]Meteors

bzoj 2527: [Poi2011]Meteors

【题意】

把一个环 分成 m 份, 每份各属于 n 个国家中的一个, 每次 给 Li ~ Ri 这段区间加上 Ci, 问第 i 个国家 在第几次 达到了 Ki。

 

【题解】

考虑这道题的弱化版: 只有一个国家, 二分修改操作就可以 log n 地计算出答案了。

那么这道题 又有哪里被强化了呢?

  1. 每次修改都要改一段区间而不是一个点了
    区间修改自然的应对措施: 线段树或树状数组
  2. 有多个国家要计算了
    能否还向原来一样二分呢? 似乎是可以的,只是每一次都要对 每一个国家分别计算 在 l ~ mid 的这段区间是否合法就可以了。

噔噔噔! 于是“整体二分”的大致思想就出来了。

具体实现的时候, 每一次 二分在 判是否合法的时候 都可以将 当前的 集合 分成 两个 子集 :在 mid 之前就可以 完成的 和在 mid 之前不可以完成的, 把这二者分别递归至 l ~ mid 区间 和 mid + 1 ~ r 区间

 

代码可以看这个人的,我的比较丑,,

 

整 体二分 写出来感觉很像一棵线段树呢, 其实整体二分就是把在二分每一个点的时候所有可能走到的路径 都走一遍(走出来自然是一个完全二叉树), 避免了一个点被计算多次, 虽然也会走到一些不必要的点, 但在整体上 还是 把 n * logn 的 复杂度 降为 2 * n 了。

bzoj 2527: [Poi2011]Meteors