Submission #915016

#TimeUsernameProblemLanguageResultExecution timeMemory
915016vjudge1Detecting Molecules (IOI16_molecules)C++17
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>

#include <cassert>
#include <cstdio>
#include <vector>

#include "molecules.h"
using namespace std;

// #include "molecules.h"
using namespace std;

using Bitset = bitset<500010>;

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>();
}
int main() {
        int n, l, u;
        assert(3 == scanf("%d %d %d", &n, &l, &u));
        std::vector<int> w(n);
        for (int i = 0; i < n; i++)
                assert(1 == scanf("%d", &w[i]));
        std::vector<int> result = find_subset(l, u, w);

        printf("%d\n", (int)result.size());
        for (int i = 0; i < (int)result.size(); i++)
                printf("%d%c", result[i], " \n"[i == (int)result.size() - 1]);
}

Compilation message (stderr)

molecules.cpp: In function 'std::vector<int> find_subset(int, int, std::vector<int>)':
molecules.cpp:47:54: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   47 |                                         int mid = le + ri >> 1;
      |                                                   ~~~^~~~
/usr/bin/ld: /tmp/ccnkOKt8.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccOjWJu9.o:molecules.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status