Submission #915017

#TimeUsernameProblemLanguageResultExecution timeMemory
915017vjudge1Detecting Molecules (IOI16_molecules)C++17
100 / 100
38 ms6484 KiB
#include "molecules.h"

#include <bits/stdc++.h>
using namespace std;

std::vector<int> find_subset(int l, int u, std::vector<int> w) {
        int n = w.size();
        vector<int> ord(n);
        iota(ord.begin(), ord.end(), 0);
        sort(ord.begin(), ord.end(), [&](int i, int j) { return w[i] < w[j]; });
        vector<int64_t> pref(n + 1);
        pref[0] = 0;
        for (int i = 0; i < n; i++) pref[i + 1] = pref[i] + w[ord[i]];
        for (int i = 1; i <= n; i++) {
                int64_t low = pref[i];
                int64_t high = pref[n] - pref[n - i];
                if (l <= low && low <= u) {
                        vector<int> ans;
                        for (int j = 0; j < i; j++) ans.push_back(ord[j]);
                        return ans;
                }
                if (l <= high && high <= u) {
                        vector<int> ans;
                        for (int j = n - i; j < n; j++) ans.push_back(ord[j]);
                        return ans;
                }
                if (high < l || u < low) continue;
                vector<int> ans;
                for (int j = 0; j < i; j++) ans.emplace_back(ord[j]);
                int64_t cur = low;
                for (int j = i - 1; j >= 0; j--) {
                        int le = i - 1, ri = n - 1 - (i - 1 - j);
                        if (cur + w[ord[ri]] - w[ord[j]] < l) {
                                cur += w[ord[ri]] - w[ord[j]];
                                ans[j] = ord[ri];
                        } else {
                                while (le <= ri) {
                                        int mid = le + ri >> 1;
                                        if (cur + w[ord[mid]] - w[ord[j]] > u) {
                                                ri = mid - 1;
                                        } else if (cur + w[ord[mid]] - w[ord[j]] < l) {
                                                le = mid + 1;
                                        } else {
                                                cur -= w[ord[j]];
                                                cur += w[ord[mid]];
                                                assert(l <= cur && cur <= u);
                                                ans[j] = ord[mid];
                                                return ans;
                                        }
                                }
                        }
                }
        }
        return vector<int>();
}

Compilation message (stderr)

molecules.cpp: In function 'std::vector<int> find_subset(int, int, std::vector<int>)':
molecules.cpp:38:54: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   38 |                                         int mid = le + ri >> 1;
      |                                                   ~~~^~~~
#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...