Submission #589906

#TimeUsernameProblemLanguageResultExecution timeMemory
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...