제출 #1008919

#제출 시각아이디문제언어결과실행 시간메모리
1008919Ausp3xDetecting Molecules (IOI16_molecules)C++17
100 / 100
113 ms4168 KiB
// 人外有人,天外有天
// author: Ausp3x

#pragma GCC optimize("O1, O2, O3, Ofast, unroll-loops")
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
typedef long long             lng;
typedef unsigned int          uint;
typedef unsigned long long    ulng;
using namespace std;
using namespace __gnu_pbds;

int const INF32 = 0x3f3f3f3f;
lng const INF64 = 0x3f3f3f3f3f3f3f3f;

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

    if (u <= 10000 && n <= 10000) {
        vector<int> dp(u + 1, -1);
        for (int i = 0; i < n; i++)
            for (int j = u; j >= 0; j--) {
                if (j - w[i] < 0)
                    continue;

                if (j - w[i] == 0) {
                    if (dp[j] == -1)
                        dp[j] = i;
                    continue;
                }

                if (dp[j] != -1 || dp[j - w[i]] == -1)
                    continue;
                
                dp[j] = i;
            }

        // for (int i = 0; i <= u; i++)
        //     cout << dp[i] << ' ';
        // cout << endl;

        vector<int> ans;
        for (int i = l; i <= u; i++) {
            if (dp[i] == -1)
                continue;

            int ii = i;
            while (ii > 0) {
                ans.push_back(dp[ii]);
                ii -= w[dp[ii]];
            }

            break;
        }

        return ans;
    }

    vector<pair<int, int>> w_idxs;
    for (int i = 0; i < n; i++)
        w_idxs.push_back({w[i], i});
    
    sort(w_idxs.begin(), w_idxs.end());

    int lft = 0, rht = n;
    while (lft <= rht) {
        int md = (lft + rht) / 2;

        lng sum = 0;
        for (int i = 0; i < md; i++)
            sum += w_idxs[i].first;

        if (sum > u) {
            rht = md - 1;
            continue;
        }

        int j = n;
        while (sum < l && n - j < md && j > md) {
            j--;
            sum -= w_idxs[n - j - 1].first;
            sum += w_idxs[j].first;
        }

        if (sum < l) 
            lft = md + 1;
        else {
            vector<int> ans;
            for (int i = n - j; i < md; i++)
                ans.push_back(w_idxs[i].second);
            for (int i = j; i < n; i++)
                ans.push_back(w_idxs[i].second);

            return ans;
        }
    }

    return {};
}

/*
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int t = 1;
    cin >> t;
    while (t--) {
        int l, u, n;
        cin >> l >> u >> n;
        vector<int> w(n);
        for (int &x : w)
            cin >> x;
        
        vector<int> ans = find_subset(l, u, w);

        cout << ans.size() << endl;
        for (int x : ans)
            cout << x << ' ';
        cout << endl;
    }

    return 0;
}
//*/

컴파일 시 표준 에러 (stderr) 메시지

molecules.cpp:4:55: warning: bad option '-f O2' to pragma 'optimize' [-Wpragmas]
    4 | #pragma GCC optimize("O1, O2, O3, Ofast, unroll-loops")
      |                                                       ^
molecules.cpp:4:55: warning: bad option '-f O3' to pragma 'optimize' [-Wpragmas]
molecules.cpp:4:55: warning: bad option '-f Ofast' to pragma 'optimize' [-Wpragmas]
molecules.cpp:4:55: warning: bad option '-f unroll-loops' to pragma 'optimize' [-Wpragmas]
molecules.cpp:16:52: warning: bad option '-f O2' to attribute 'optimize' [-Wattributes]
   16 | vector<int> find_subset(int l, int u, vector<int> w) {
      |                                                    ^
molecules.cpp:16:52: warning: bad option '-f O3' to attribute 'optimize' [-Wattributes]
molecules.cpp:16:52: warning: bad option '-f Ofast' to attribute 'optimize' [-Wattributes]
molecules.cpp:16:52: warning: bad option '-f unroll-loops' to attribute 'optimize' [-Wattributes]
#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...