Submission #409016

#TimeUsernameProblemLanguageResultExecution timeMemory
409016GurbanDetecting Molecules (IOI16_molecules)C++17
69 / 100
60 ms6272 KiB
#include <bits/stdc++.h>
#include "molecules.h"
using namespace std;

using ll = long long;

const int maxn=2e5+5;
ll p[maxn];

vector<int> find_subset(int l, int u, vector<int> w) {
	vector<int>ans;
	if(l > u) return ans;
	ll cnt = 0;
	for(int i = 0;i < (int)w.size();i++){
		if(w[i] >= l and w[i] <= u){
			ans.push_back(i);
			return ans;
		}
		if(w[i] < l) cnt += w[i];
	}
	if(cnt < l) return ans;
	
	vector<pair<int,int>>v;
	for(int i = 0;i < (int)w.size();i++) v.push_back({w[i],i});
	sort(v.begin(),v.end());
	
	vector<int>lft((int)w.size());
	lft[0] = v[0].first;
	for(int i = 1;i < (int)w.size();i++){
		lft[i] = (lft[i-1] + v[i].first);
		if(lft[i] >= l and lft[i] <= u){
			for(int j = 0;j <= i;j++) ans.push_back(v[j].second);
			return ans;
		}
	}

	// for(int i = 0;i < (int)w.size();i++) cout<<v[i].first<<' ';

	ll sum = 0;
	for(int i = (int)w.size()-1;i >= 0;i--){
		sum += v[i].first;
		if(sum >= l and sum <= u){
			for(int j = i;j < (int)w.size();j++) ans.push_back(v[j].second);
			return ans;
		}
		int bl = 0,br = i-1,md,jog = -1;
		while(bl <= br){
			md = (bl + br) / 2;
			if(sum + lft[md] >= l){
				jog = md;
				br = md - 1;
			}
			else bl = md + 1;
		}
		if(jog == -1) continue;
		if(sum + lft[jog] <= u){
			for(int j = 0;j <= jog;j++) ans.push_back(v[j].second);
			for(int j = i;j < (int)w.size();j++) ans.push_back(v[j].second);
			return ans;
		}
	}
	return ans;
}

// int main(){
// 	ios::sync_with_stdio(false);
// 	cin.tie(0);

// 	int n,l,r; cin >> n >> l >> r;
// 	vector<int>w(n);
// 	for(int i = 0;i < n;i++) cin >> w[i];
// 	vector<int> ans = find_subset(l,r,w);
// 	for(auto i : ans) cout<<i<<' ';
// }
#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...