文章目录

AGC011B Colorful Creatures 做题笔记

发布于

题意

有 $n$ 个生物,第 $i$ 个生物有大小 $A_i$ 和颜色 $i$。
第 $i$ 个生物可以吞噬第 $j$ 个元素当:
$$A_j \leq 2 \cdot A_i$$

这些生不停的吞噬这其它生物,最终成为一个生物。求该生物可能的颜色的数量。

$2 \leq n \leq 10^5, 1 \leq A_i \leq 10^9$

题解

考虑第 $i$ 个生物有没有可能成为最终的那个生物:

第 $i$ 个生物必然是从大小最小的生物开始吞噬,如果最后全部吞噬了,那么这个生物就是答案之一。

这样得到了一个 $\mathcal O\left(n^2\right)$ 的算法。

考虑如何优化:

  1. 把数组排序,二分从哪个点开始可以。
  2. 考虑到如果生物 $i$ 不能成为最后一个生物,那么一定是 $i$ 的前缀和的两倍小于第 $i + 1$ 个点的大小。所以,把数组排序,从右往左 找到第一个 $i$ 的前缀和的两倍小于第 $i + 1$ 个点的大小的点。那么这个点,以及更靠前的点不然不能成为最后一个生物。

因为要排序,复杂度是 $\mathcal O\left(n \log n\right)$。

代码

// By rbtree (https://rbtr.ee)
// Please submit with C++14!
#include <algorithm>
#include <array>
#include <cmath>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <tuple>
#include <unordered_map>
#include <utility>
#include <vector>
#define ra _Read()

using tp = long long;
tp _Read();
using namespace std;
constexpr bool __MTCS__ = 0;
constexpr tp Hat_N = 1e5 + 3;

namespace __SOL__ {
signed main() {
  tp n = ra, cnt = 0;
  array<tp, Hat_N> a, s;
  for (tp i = 1; i <= n; ++i) {
    a[i] = ra;
  }
  stable_sort(a.begin() + 1, a.begin() + n + 1);
  for (tp i = 1; i <= n; ++i) {
    s[i] = s[i - 1] + a[i];
  }
  for (tp i = n; i; --i) {
    if (s[i] * 2 < a[i + 1]) {
      break;
    }
    ++cnt;
  }
  cout << cnt << '\n';
  return 0;
}
}  // namespace __SOL__

signed main() {
  tp __MTCS__ = ::__MTCS__ ? ra : 1;
  while (__MTCS__--) {
    __SOL__::main();
  }
  return EXIT_SUCCESS;
}

tp _Read() {
  bool __neg(0);
  char __c(getchar());
  tp __val(0);
  for (; __c < 48 || __c > 57; __c = getchar()) {
    __neg = __c == 45;
  }
  for (; __c > 47 && __c < 58; __c = getchar()) {
    __val = __val * 10 + (__c & 15);
  }
  return __neg ? ~__val + 1 : __val;
}

/*#################################################################
#.................................................................#
#............................This.Code.Was.Created.By.RBTree......#
#.............#......#...............Limiting-Factor..............#
#............#.#....#.#.................Soul-Code.................#
#.............########............................................#
#............#........#..##############################...........#
#...........#..V....V......#..#........................#..#...#...#
#............#........#....#..........###..###..........#..#.#.#..#
#............#..X##X..#..#............#....#.#...........#..#...#.#
#...........#...N##N...#..#...........###..###..........#.........#
#.......MOE..#..@.....#....#.#.#.#...................#.#..........#
#.............########.....#.#.#.##############.#.#..#.#..........#
#..........................#.#.#.#.............#.#.#.#.#..........#
#......#########...........#.#.#.#.................#.#.#..........#
#.....#.........#..........#.#.#.#.................#.#.#..........#
#.#.#.#G#R#A#S#S#.#.#......#.#.#.#.................#.#.#..........#
#.###################......#.#.#.#.................#.#.#..........#
#...........................#.#.#...................#.#...........#
#.................................................................#
#################################################################*/

暂无评论

发表评论