AtCoder Beginner Contest 440

A

void solve() {
  int x, y;
  cin >> x >> y;

  while (y--) {
    x *= 2;
  }

  cout << x << '\n';
}

B

void solve() {
  int n;
  cin >> n;
  
  vector<pair<int, int>> a(n);

  for (int i = 0; i < n; i++) {
    cin >> a[i].first;
    a[i].second = i + 1;
  }

  sort(a.begin(), a.end());
  cout << a[0].second << ' ' << a[1].second << ' ' << a[2].second << '\n';
}

C

void solve() {
  // 我只能说糖丸了,这么简单的题写成这种史
  // 和我最开始的优化思路有点相同的,因为模具有周期性,所以位置i和位置i + 2*w的状态是相同的
  // 所以我们只需要创建一个2 * w的数组就可以很好的存值了
  // 然后我们通过一个长度为 w 滑动窗口就可以解题了

  // 我为什么没写完呢?因为我想的是用二维数组来存,然后二维数组的行数为(n + 2 * w - 1) / (w * 2)
  // 当w很大时,n为1,这个数组就会出错不啦不啦的,写起来就很麻烦,我就没写了
  // 所以主要的问题就是二维数组太麻烦了,其实一维数组就可以很好的解决了
  // 还有一个问题就是,我写的时候没有纸和笔,所以细节的地方不好想

  int n, w;
  cin >> n >> w;

  int w2 = 2 * w; // 因为2 * w用的多,这个也是值得学习的一个点

  vector<ll> a(w2);
  for (int i = 1; i <= n; i++) {
    int temp;
    cin >> temp;
    a[i % w2] += temp;
  }

  ll ans = accumulate(a.begin(), a.begin() + w, 0ll);
  ll cur = ans;
  // 滑动窗口
  // 滑动窗口这里也有问题,就是不是窗口的右边到了终点就没了,是窗口要重新回到起点才结束

  for (int i = 1; i < w2; i++) {
    cur -= a[i - 1];
    cur += a[(i + w - 1) % w2];
    ans = min(cur, ans);
  }

  cout << ans << '\n';
}

D

void solve() {
  int n, q;
  cin >> n >> q;

  vector<ll> a(n);
  for (auto &i : a) cin >> i;
  sort(a.begin(), a.end());


  while (q--) {
    ll x, y;
    cin >> x >> y;

    // 找到第y个大于等于x的不在数组a中的值
    // 也就是说到这个数为止,一共有y个不在数组a中的数,且都大于等于x
    // l设置为x,因为这个答案不可能比x小

    ll l = x, r = 2e9;
    while (l < r) {
      ll mid = (l + r) / 2; // 向下取整
      int len = upper_bound(a.begin(), a.end(), mid)  - lower_bound(a.begin(), a.end(), x);
      if (mid - x + 1 - len >= y) {
        r = mid;
      }
      else {
        l = mid + 1;
      }
    }
    cout << l << '\n';
  }
}

E

void solve() {
  int n, k, x;
  cin >> n >> k >> x;

  vector<int> a(n);
  for (auto &i : a) cin >> i;
  sort(a.rbegin(), a.rend());

  vector<int> diff(n);
  for (int i = 0; i < n; i++) {
    diff[i] = a[0] - a[i];
  }

  priority_queue<tuple<ll, int, int>> state;
  cout << 1ll * a[0] * k << '\n';
  
  // 当n为1是diff[1]会越界,我没考虑,但是依然AC了
  state.emplace(1ll * a[0] * k - diff[1], 1, 1);

  for (int i = 0; i < x; i++) {
    auto [cur, idx, cnt] = state.top();
    state.pop();

    cout << cur << '\n';

    if (idx + 1 < n) {
      state.emplace(cur + diff[idx] - diff[idx + 1], idx + 1, cnt);
    }
    if (cnt < k) {
      state.emplace(cur - diff[idx], idx, cnt + 1);
    }
  }
}
posted @ 2026-01-22 15:49  颜开Young  阅读(1)  评论(0)    收藏  举报