Submission #296052

#TimeUsernameProblemLanguageResultExecution timeMemory
296052RealSuperman1Detecting Molecules (IOI16_molecules)C++14
100 / 100
517 ms17376 KiB
#include <bits/stdc++.h> #define ll long long #define pb push_back #define fi first #define se second #define pll pair<long long, long long> #define pii pair<int, int> #include "molecules.h" using namespace std; int n; vector <int> case1234(int l, int u, vector <int> w) { vector <bool> dp[2]; vector <int> take; dp[0].assign(u + 1, false); dp[1].assign(u + 1, false); take.assign(u + 1, -1); dp[1][0] = true; for (int i = 0; i < w.size(); i++) { int md = i % 2; for (int j = w[i]; j <= u; j++) { if (dp[1 - md][j]) continue; if (dp[1 - md][j - w[i]]) { dp[md][j] = true; take[j] = i; } } for (int j = 0; j <= u; j++) dp[md][j] = (dp[md][j] | dp[1 - md][j]); } vector <int> ans = {}; int md = 1 - n % 2; for (int i = l; i <= u; i++) if (dp[md][i]) { int cur = i; while (cur != 0) { ans.pb(take[cur]); cur -= w[take[cur]]; } break; } sort(ans.begin(), ans.end()); return ans; } vector <int> case56(int l, int u, vector <int> w) { ll sm = 0; vector <pair<ll, int> > x; set <int> ans = {}; for (int i = 0; i < w.size(); i++) x.pb({w[i] * 1ll, i}); sort(x.begin(), x.end()); bool flag = false; int cur = 0; for (int i = 0; i < x.size(); i++) { if (x[i].fi + sm <= u) { sm += x[i].fi; ans.insert(x[i].se); } else { sm += x[i].fi - x[cur].fi; ans.erase(x[cur].se); ans.insert(x[i].se); cur++; } if (l <= sm) { flag = true; break; } } if (!flag) return {}; vector <int> anss = {}; for (set <int>::iterator it = ans.begin(); it != ans.end(); it++) anss.pb(*it); sort(anss.begin(), anss.end()); return anss; } vector <int> find_subset(int l, int u, vector <int> w) { n = w.size(); int maxw = 0; for (int to : w) maxw = max(maxw, to); if (n <= 10000 && maxw <= 10000 && u <= 10000) return case1234(l, u, w); return case56(l, u, w); }

Compilation message (stderr)

molecules.cpp: In function 'std::vector<int> case1234(int, int, std::vector<int>)':
molecules.cpp:22:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   22 |  for (int i = 0; i < w.size(); i++) {
      |                  ~~^~~~~~~~~~
molecules.cpp: In function 'std::vector<int> case56(int, int, std::vector<int>)':
molecules.cpp:55:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   55 |  for (int i = 0; i < w.size(); i++)
      |                  ~~^~~~~~~~~~
molecules.cpp:60:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   60 |  for (int i = 0; i < x.size(); i++) {
      |                  ~~^~~~~~~~~~
#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...