Submission #1101129

#TimeUsernameProblemLanguageResultExecution timeMemory
1101129rainboyTreasure (IOI24_treasure)C++17
100 / 100
288 ms6136 KiB
#include "treasure.h"
#include <cstring>
#include <utility>
#include <vector>

using namespace std;

typedef pair<int, int> pi;
typedef vector<int> vi;
typedef vector<pi> vpi;

namespace encoder {
	const int N = 40000, X = 500000001, A = 2000000001;

	unsigned int Z = 12345;

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

	int xx[N], yy[N], ii[N], ii_[N], pp[N];

	int *vv;

	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 (vv[ii[j]] == vv[i_])
					j++;
				else if (vv[ii[j]] < vv[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;
		}
	}

	vi encode(vpi xy) {
		int n = xy.size();
		for (int i = 0; i < n; i++)
			xx[i] = xy[i].first, yy[i] = xy[i].second;
		vi aa(n * 3, A - 1);
		for (int i = 0; i < n; i++)
			aa[i] = xx[i], aa[n + i] = X + yy[i];
		for (int i = 0; i < n; i++)
			ii[i] = i;
		vv = yy, sort(ii, 0, n);
		for (int i = 0; i < n; i++)
			yy[ii[i]] = i;
		vv = xx, sort(ii, 0, n);
		for (int i = 0; i < n; i++) {
			int p = yy[ii[i]];
			ii_[pp[i] = p] = i;
		}
		memcpy(ii, ii_, n * sizeof *ii_);
		for (int j = n - 1; j >= 0; j--) {
			int i = ii[j];
			aa[n * 2 + j] = X * 2 + j * (j + 1) / 2 + i;
			int p = pp[i], q = pp[j];
			ii[pp[i] = q] = i, ii[pp[j] = p] = j;
		}
		return aa;
	}
}

vi encode(vpi xy) {
	return encoder::encode(xy);
}

namespace decoder {
	const int N = 40000, X = 500000001, A = 2000000001;

	unsigned int Z = 12345;

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

	int xx[N], yy[N], aa[N * 3];

	int *vv;

	void sort(int *aa, int l, int r) {
		while (l < r) {
			int i = l, j = l, k = r, a = aa[l + rand_() % (r - l)], tmp;
			while (j < k)
				if (aa[j] == a)
					j++;
				else if (aa[j] < a) {
					tmp = aa[i], aa[i] = aa[j], aa[j] = tmp;
					i++, j++;
				} else {
					k--;
					tmp = aa[j], aa[j] = aa[k], aa[k] = tmp;
				}
			sort(aa, l, i);
			l = k;
		}
	}

	vpi decode(vi aa_) {
		int n = aa_.size() / 3;
		for (int i = 0; i < n * 3; i++)
			aa[i] = aa_[i];
		sort(aa, 0, n * 3);
		for (int i = 0; i < n; i++)
			xx[i] = aa[i], yy[i] = aa[n + i] - X;
		for (int j = 0; j < n; j++) {
			int i = aa[n * 2 + j] - X * 2 - j * (j + 1) / 2, tmp;
			tmp = yy[i], yy[i] = yy[j], yy[j] = tmp;
		}
		vpi xy(n);
		for (int i = 0; i < n; i++)
			xy[i] = make_pair(xx[i], yy[i]);
		return xy;
	}
}

vpi decode(vi aa) {
	return decoder::decode(aa);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...