제출 #1001828

#제출 시각아이디문제언어결과실행 시간메모리
1001828vjudge1Detecting Molecules (IOI16_molecules)C++14
0 / 100
1 ms348 KiB
#include "molecules.h"
#include <bits/stdc++.h>
using namespace std;
#define ins insert
#define pb push_back
#define pii pair<int, int>
#define endl '\n'
#define drop(x) cout<<(x)<<endl; return;
#define all(x) x.begin(),x.end()
vector<int> find_subset(int l, int u, vector<int> arr) {
    int n = arr.size();
    int ansp = -1;
    vector<int> ans;
    vector<int> temp=arr;
    sort(all(arr));
    swap(l,u);
    set<pair<int,pair<int,int>>> var;
    int idx =0; 
    for(int i=0;i<n;i++){
        // cout<<arr[i]<<endl;
        if(arr[i]>l){
            continue;
        }

        if(arr[i]>=u){
            for(int j=0;j<n;j++){
                if(temp[j]==arr[i]){
                    ans.pb(j);
                    break;
                }
            }
            return ans;
        }

        if(!var.empty()){
            int x = l-arr[i];
            auto it = var.upper_bound({x,{-1,-1}});
            if(it!=var.begin()){
                --it;
                int sumnow = arr[i]+ (*it).first;
                var.ins({sumnow,{i,(*it).second.second}});
                if(sumnow>=u && sumnow<=l){
                    ansp=sumnow;
                    idx=i;
                    break;
                }
            }
            if(arr[i]<=u){

                int y = u - arr[i]; 
                auto it2 = var.lower_bound({y,{-1,-1}});
                if(it2!=var.end()){
                    if((*it2).first + arr[i]>=u &&(*it2).first<=l ){
                        int sumnow = arr[i]+ (*it).first;
                        var.ins({sumnow,{i,(*it).second.second}});
                        if(sumnow>=u && sumnow<=l){
                            ansp=sumnow;
                            idx=i;
                            break;
                        }
                    }
                }

            }
        }
        var.ins({arr[i],{i,i}});
    }

    
    // reverse(all(ans));
    map<int,int> need;
    vector<int> ans2;
    int sum=0;
    if(ansp==-1){
        return ans2;
    }
    int tmp=ansp;
    set<int> used;
    while(!(sum>=u && sum<=l)){
        // cout<<sum<<endl;
        auto it = var.lower_bound({tmp-sum,{idx,-1}});
        need[arr[(*it).second.first]]++;
        sum+=arr[(*it).second.first];
        idx = (*it).second.second;
        var.erase(it);

    }
    
    for(int i=0;i<n;i++){
        if(need[temp[i]]){
            ans2.pb(i);
            need[temp[i]]--;
        }
    }
    return ans2;
}
#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...