제출 #380707

#제출 시각아이디문제언어결과실행 시간메모리
380707madlogicDetecting Molecules (IOI16_molecules)C++17
46 / 100
150 ms1004 KiB
#include "molecules.h"
#include <bits/stdc++.h>
using namespace std;

std::vector<int> find_subset(int l, int u, std::vector<int> w) {
  srand(time(NULL));
  int n = (int) w.size();
  vector<bool> dp(u + 1);
  dp[0] = true;
  const int mxxx = 10000;
  if (n <= mxxx && u <= mxxx) {
    vector<int> par(u + 1);
    vector<int> idx(u + 1);
    for (int i = 0; i < n; i++) {
      auto ndp = dp;
      for (int j = w[i]; j <= u; j++) {
        if (!dp[j] && dp[j - w[i]]) {
          ndp[j] = true;
          idx[j] = i;
          par[j] = j - w[i];
        }
      }
      dp = ndp;
    }
    vector<int> res;
    for (int i = l; i <= u; i++) {
      if (dp[i]) {
        while (par[i]) {
          res.push_back(idx[i]);
          i = par[i];
        }
        res.push_back(idx[i]);
        break;
      }
    }
    return res;
  } else {
    vector<pair<int, int>> nums;
    for (int i = 0; i < n; i++) {
      if (w[i] <= u) {
        nums.emplace_back(w[i], i);
      }
    }
    for (int i = 0; i < 1000; i++) {
      random_shuffle(begin(nums), end(nums));
      int cur = 0;
      multiset<pair<int, int>> ms;
      for (auto& [x, y] : nums) {
        cur += x;
        ms.insert({x, y});
        while (cur > u) {
          int remove = u - cur;
          auto lb = ms.lower_bound({remove, -1});
          cur -= (*lb).first;
          ms.erase(lb);
        }
      }
      if (cur < l || cur > u) {
        return {};
      }
      vector<int> res;
      for (auto s : ms) {
        res.push_back(s.second);
      }
      return res;
    }
  }
  return {};
}

// int main() {
//   int n, l, r;
//   cin >> n >> l >> r;
//   vector<int> a(n);
//   for (int i = 0; i < n; i++) {
//     cin >> a[i];
//   }
//   for (int p : find_subset(l, r, a)) {
//     cout << p << ' ';
//   }
// }
#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...