Submission #1137299

#TimeUsernameProblemLanguageResultExecution timeMemory
1137299alterioTeams (IOI15_teams)C++20
0 / 100
4102 ms207348 KiB
#include "teams.h"
#include <bits/stdc++.h>

using namespace std;

const int mxn = 5e5 + 100;

int N;

vector<pair<int, int>> A;

struct Node {
	int sz, mnA, mxB, lz;
	vector<pair<int, int>> A;
};

struct SGT {
	vector<Node> sgt;

	SGT(int sz) {
		sgt.resize(4 * sz);
	}

	Node merge(Node a, Node b) {
		Node ans;
		ans.sz = {a.sz + b.sz};
		vector<pair<int, int>> v;
		for (auto x : a.A) v.push_back(x);
		for (auto x : b.A) v.push_back(x);
		sort(v.begin(), v.end());
		ans.A = v;
		ans.mnA = min(a.mnA, b.mnA);
		ans.mxB = max(a.mxB, b.mxB);
		return ans;
	}

	void build(int k, int l, int r) {
		if (l == r) {
			sgt[k].sz = 1;
			sgt[k].A.push_back({A[l].first, 1});
			sgt[k].mnA = A[l].first;
			sgt[k].mxB = A[l].second;
			return;
		}
		int mid = (l + r) / 2;
		build(k * 2, l, mid);
		build(k * 2 + 1, mid + 1, r);
		sgt[k] = merge(sgt[k * 2], sgt[k * 2 + 1]);
	}

	void push(int k, int l, int r) {
		if (sgt[k].lz == 1) {
			sgt[k * 2].lz = sgt[k * 2 + 1].lz = 1;
			for (auto x : sgt[k].A) x.second = 1;
			sgt[k].sz = r - l + 1;
		}
		if (sgt[k].lz == -1) {
			sgt[k * 2].lz = sgt[k * 2 + 1].lz = -1;
			for (auto x : sgt[k].A) x.second = 0;
			sgt[k].sz = 0;
		}
		sgt[k].lz = 0;
	}

	int get(int k, int l, int r, int i, int sz) {
		push(k, l, r);
		if (sgt[k].mnA > i || sgt[k].mxB < i || !sgt[k].sz) return 0;
		int mid = (l + r) / 2;
		if (sgt[k].mnA <= i && sgt[k].mxB >= i) {
			if (sgt[k].sz <= sz && sgt[k].sz == r - l + 1) {
				int SZ = sgt[k].sz;
				sgt[k].lz = -1;
				push(k, l, r);
				return SZ;
			}
			int ans = get(k * 2 + 1, mid + 1, r, i, sz);
			sgt[k] = merge(sgt[k * 2], sgt[k * 2 + 1]);
			if (ans == sz) return ans;
			ans += get(k * 2, l, mid, i, sz - ans);
			sgt[k] = merge(sgt[k * 2], sgt[k * 2 + 1]);
			return ans;
		}
		int ans = get(k * 2, l, mid, i, sz);
		if (ans != sz) ans += get(k * 2 + 1, mid + 1, r, i, sz - ans);
		sgt[k] = merge(sgt[k * 2], sgt[k * 2 + 1]);
		return ans;
	}
} sgt(mxn);

void init(int _N, int _A[], int _B[]) {
	N = _N;
	for (int i = 0; i < N; i++) A.push_back({_A[i], _B[i]});
	sort(A.begin(), A.end(), [&] (pair<int, int> a, pair<int, int> b) {
		return a.second < b.second;
	});
	sgt.build(1, 0, N - 1);
}

int can(int M, int K[]) {
	vector<int> v;
	for (int i = 0; i < M; i++) v.push_back(K[i]);
	sort(v.begin(), v.end());
	sgt.sgt[1].lz = 1;
	for (int i = 0; i < M; i++) {
		int people = sgt.get(1, 0, N - 1, v[i], v[i]);
		if (people != v[i]) return 0;
	}
	return 1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...