제출 #589906

#제출 시각아이디문제언어결과실행 시간메모리
589906Sam_a17Detecting Molecules (IOI16_molecules)C++14
46 / 100
1081 ms25304 KiB
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
// #include "molecules.h"
#include <cstdio>
using namespace std;
#define ll long long

const int M = 5e5  + 10, N = 5e5 + 10;

int n;
bool dp[M];
int bit[N]; 
int par[N];

std::vector<int> find_subset(int l, int u, std::vector<int> w) {
  n = w.size();

  vector<int> possible{0};
  vector<int> answ;
  dp[0] = true;

  // sort(w.begin(), w.end());

  vector<pair<int, int>> vi;

  for(int i = 0; i < n; i++) {
    vi.push_back({w[i], i});
  }

  set<int> st;
  for(int i = 1; i < M; i++) {
    st.insert(i);
  }

  sort(vi.rbegin(), vi.rend());
  
  for(int i = 0; i < n; i++) {

    vector<int> to_add;
    if(st.size() < possible.size()) {
      for(auto j: st) {
        if(j >= w[i] && dp[j - w[i]]) {
          to_add.push_back(j);
        }
      }
    } else {
      for(auto j: possible) {
        if(j + vi[i].first > u) {
          continue;
        }

        if(dp[j + vi[i].first]) {
          continue;
        }

        dp[j + vi[i].first] = true;
        to_add.push_back(j);
      } 
    }

    for(auto j: to_add) {
      par[j + vi[i].first] = j;
      bit[j + vi[i].first] = vi[i].second;

      if(j + vi[i].first >= l && j + vi[i].first <= u) {
        int curr = j + vi[i].first;
        while(curr) {
          answ.push_back(bit[curr]);
          curr = par[curr];
        }

        return answ;
      }
      st.erase(j + vi[i].first);
      possible.push_back(j + vi[i].first);
    }

  }
  
  return answ;
}
#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...