Submission #489091

#TimeUsernameProblemLanguageResultExecution timeMemory
4890911neDetecting Molecules (IOI16_molecules)C++14
0 / 100
1 ms288 KiB
#include "molecules.h"
#include<bits/stdc++.h>
using namespace std;
std::vector<int> find_subset(int l, int u, std::vector<int> arr) {
    int n = arr.size();
    int sum = 0;
    for(int i = 0;i<n;++i){
    	sum+=arr[i];
    }
    vector<int>ans;
    if (sum<l){
    	return ans;
    }   
    map<int,int>dp;
    vector<int>par(u+1,-1);
    if (l<sum - u){
    dp[0]=1;
    int val = -1;
    for (int i = 0 ;i<n;++i){ 
    	for (auto j:dp){
    		int x = j.first;
    		if (x+arr[i]>u)continue;
    		if (par[x+arr[i]]!=-1)continue;
    		if (par[x]==i)continue;
    		dp[x+arr[i]]=true;
    		par[x+arr[i]]=i;
    		if (x+arr[i]>=l&&x+arr[i]<=u){
    			val = x+arr[i];
    			break;
    		}
    	}
    	if (val!=-1)break;	
    }
    while(val>0){
    	ans.push_back(par[val]);
    	val-=arr[par[val]];
    }
    }
    else{
    	int temp = sum - l;
     l  = sum - u;
     u = temp;
     dp[0]=1;
    int val = -1;
    for (int i = 0 ;i<n;++i){ 
    	for (auto j:dp){
    		int x = j.first;
    		if (x+arr[i]>u)continue;
    		if (par[x+arr[i]]!=-1)continue;
    		if (par[x]==i)continue;
    		dp[x+arr[i]]=true;
    		par[x+arr[i]]=i;
    		if (x+arr[i]>=l&&x+arr[i]<=u){
    			val = x+arr[i];
    			break;
    		}
    	}
    	if (val!=-1)break;	
    }
    vector<bool>got(n,false);
    bool ok=false;
    while(val>0){
    	ok=true;               
    	got[par[val]]=true;
    	val-=arr[par[val]];
    }
    if (ok)
    for (int i = 0;i<n;++i){
    	if (!got[i])ans.push_back(i);
    }
    }
    return ans;
}
#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...