Submission #218971

#TimeUsernameProblemLanguageResultExecution timeMemory
218971yayupsDetecting Molecules (IOI16_molecules)C++11
69 / 100
122 ms5612 KiB
// created 01 FEB 2018
// updated JUNE 2018
// updated JULY 2018
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <cstring>
#include <map>
#include <cstdlib>
#include <ctime>
#include <cassert>
#include <bitset>
#include <fstream>
#include <sstream>
#include <cstdlib>
#include <list>
#include <stdexcept>

#define N 200000

using namespace std;

vector<int> find_subset(int l, int u, vector<int> ww) {
	vector<int> w;
	for(int i=0;i<ww.size();i++) w.push_back(ww[i]);
	sort(w.begin(),w.end());
	int n=w.size();
	
	//need to find sorting bijection
	vector<int> A(n);
	map<int,int> mults;
	map<int,int>::iterator it;
	for(int i=0;i<n;i++) {
		A[i]=lower_bound(w.begin(),w.end(),ww[i])-w.begin();
		it=mults.find(ww[i]);
		if(it==mults.end()) {
			mults.insert(pair<int,int>(ww[i],1));
		}
		else {
			A[i] = A[i]+ mults[ww[i]];
			mults[ww[i]]++;
		}
	}
	vector<int> B(n);
	for(int i=0;i<n;i++) {
		B[A[i]]=i;
	}
	
	
	
	
	//real solution
	vector<int> v(n);
	vector<int> result;
	v[0]=w[0];
	//cout << v[0] << endl;
	for(int i=1;i<n;i++) {
		v[i] = v[i-1]+w[i];
		//cout <<  v[i]<< endl;
	}
	
	vector<int>::iterator low,up;
	
	int a,b=0;
	int t;
	
	//it's going to be v[b]-v[a]
	for(a=-1;a<n;a++) {
		if(a==-1) {
			t=0;
		}
		else {
			t=v[a];
		}
		low=lower_bound(v.begin(),v.end(),l+t);
		up =upper_bound(v.begin(),v.end(),u+t);
		//cout << "for a = " << a << " we have low = "<<low-v.begin()<<" and up= "<<up-v.begin() << endl;
		if(low-v.begin()<=up-v.begin()) {
			b=low-v.begin();
			if(v[b]-t>=l and v[b]-t<=u) break;
			//cout  << a;
		}
	}
	//cout  << a<<endl<<b<<endl;
	result.clear();
	if(a==n) {
		return result;
	}
	
	for(int i=0;i<b-a;i++) {
		result.push_back(B[a+1+i]);
	}
	
	//cout << a << endl;
	
	return result;
}

Compilation message (stderr)

molecules.cpp: In function 'std::vector<int> find_subset(int, int, std::vector<int>)':
molecules.cpp:31:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<ww.size();i++) w.push_back(ww[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...