Submission #405032

#TimeUsernameProblemLanguageResultExecution timeMemory
405032rainboyDetecting Molecules (IOI16_molecules)C11
100 / 100
75 ms2764 KiB
#include "molecules_c.h"
#include <string.h>

#define N	200000

unsigned int X = 12345;

int rand_() {
	return (X *= 3) >> 1;
}

int ww[N];

void sort(int *ii, int l, int r) {
	while (l < r) {
		int i = l, j = l, k = r, i_ = ii[l + rand_() % (r - l)], tmp;

		while (j < k)
			if (ww[ii[j]] == ww[i_])
				j++;
			else if (ww[ii[j]] < ww[i_]) {
				tmp = ii[i], ii[i] = ii[j], ii[j] = tmp;
				i++, j++;
			} else {
				k--;
				tmp = ii[j], ii[j] = ii[k], ii[k] = tmp;
			}
		sort(ii, l, i);
		l = k;
	}
}

int find_subset(int lower, int upper, int *ww_, int n, int *res) {
	static int ii[N];
	int m, h, i;
	long long lower_, upper_;

	memcpy(ww, ww_, n * sizeof *ww_);
	for (i = 0; i < n; i++)
		ii[i] = i;
	sort(ii, 0, n);
	lower_ = upper_ = 0;
	for (m = 1; m <= n; m++) {
		lower_ += ww[ii[m - 1]], upper_ += ww[ii[n - m]];
		if (lower_ <= upper && upper_ >= lower) {
			long long sum;

			sum = 0;
			for (h = 0; h < m; h++)
				res[h] = ii[h], sum += ww[ii[h]];
			for (h = m - 1; h >= 0 && sum < lower; h--)
				res[h] = ii[n - 1 - (m - 1 - h)], sum += ww[res[h]] - ww[ii[h]];
			return m;
		}
	}
	return 0;
}
#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...