제출 #296723

#제출 시각아이디문제언어결과실행 시간메모리
296723Haunted_CppDetecting Molecules (IOI16_molecules)C++17
100 / 100
72 ms7160 KiB
#include <bits/stdc++.h>

#include "molecules.h"
using namespace std;

vector<int> find_subset(int lo, int hi, vector<int> w) {
  const int n = w.size();
  vector<pair<int, int>> arr(n);
  for (int i = 0; i < n; i++) {
    arr[i] = {w[i], i};
  }
  sort(arr.begin(), arr.end());
  vector<long long> dp(n);
  dp[0] = arr[0].first;
  for (int i = 1; i < n; i++) {
    dp[i] = arr[i].first + dp[i - 1];
  }
  auto range_sum = [&](int l, int r) {
    if (l >= n) return 0LL;
    return dp[r] - (l - 1 >= 0 ? dp[l - 1] : 0LL);
  };
  long long s = 0;
  for (int i = 0; i <= n; i++) {
    int l = i + 1;
    int r = n;
    while(l < r) {
      const int mid = l + (r - l) / 2;
      long long add = range_sum(mid, n - 1);
      if (s + add <= hi) r = mid;
      else l = mid + 1;
    }
    s += range_sum(r, n - 1);
    if (s >= lo && s <= hi) {
      vector<int> res;
      for (int x = 0; x < i; x++) {
        res.emplace_back(arr[x].second);
      }
      for (int x = r; x < n; x++) {
        res.emplace_back(arr[x].second);
      }
      return res;
    }
    s += arr[i].first;
    s -= range_sum(r, n - 1);
  }
  return vector<int>();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...