Submission #1250503

#TimeUsernameProblemLanguageResultExecution timeMemory
1250503NikoBaoticTeam Contest (JOI22_team)C++20
100 / 100
996 ms129712 KiB
#include "bits/stdc++.h"

using namespace std;

typedef long long ll;
typedef pair<ll, ll> pii;

#define all(x) x.begin(), x.end()
#define sz(x) ((int) ((x).size()))
#define pb push_back
#define F first
#define S second
#define FIO ios_base::sync_with_stdio(false); cin.tie(0)

const int N = 2e5 + 10;
const int K = 30;

int n;
int x[N];
int y[N];
int z[N];
bool k[N];
bool us[N];
vector<int> vx[N * 3];
vector<int> vy[N * 3];
vector<int> vz[N * 3];
int oc[N];

int main() {
	FIO;
	
	cin >> n;
	
	multiset<pii> sx, sy, sz;
	map<int, int> conv;
	set<int> se;

	int cur = 0;

	for (int i = 0; i < n; i++) {
		cin >> x[i] >> y[i] >> z[i];

		sx.insert({x[i], i});
		sy.insert({y[i], i});
		sz.insert({z[i], i});

		se.insert(x[i]);
		se.insert(y[i]);
		se.insert(z[i]);
	}

	for (int l : se) {
		conv[l] = cur++;
	}

	for (int i = 0; i < n; i++) {
		vx[conv[x[i]]].pb(i);
		vy[conv[y[i]]].pb(i);
		vz[conv[z[i]]].pb(i);
	}

	int bmx = -1;
	int bmy = -1;
	int bmz = -1;

	set<int> rem;	

	while (sz(sx)) {
		int mx = prev(sx.end())->F;
		int my = prev(sy.end())->F;
		int mz = prev(sz.end())->F;

		if (mx != bmx) {
			for (int l : vx[conv[mx]]) {
				oc[l]++;

				if (oc[l] > 1) {
					rem.insert(l);	
				}
			}
		}

		if (my != bmy) {
			for (int l : vy[conv[my]]) {
				oc[l]++;

				if (oc[l] > 1) {
					rem.insert(l);	
				}
			}
		}

		if (mz != bmz) {
			for (int l : vz[conv[mz]]) {
				oc[l]++;

				if (oc[l] > 1) {
					rem.insert(l);	
				}
			}
		}

		bool c = 0;

		for (int l : rem) {
			if (!k[l]) {
				sx.erase(sx.find({x[l], l}));
				sy.erase(sy.find({y[l], l}));
				sz.erase(sz.find({z[l], l}));

				k[l] = 1;
				c = 1;
			}
		}

		rem.clear();

		bmx = mx;
		bmy = my;
		bmz = mz;

		if (c == 0) break;
	}

	int cnt = K;

	while (sz(sx) and cnt) {
		us[prev(sx.end())->S] = 1;
		sx.erase(prev(sx.end()));
		cnt--;	
	}

	cnt = K;
	
	while (sz(sy) and cnt) {
		us[prev(sy.end())->S] = 1;
		sy.erase(prev(sy.end()));
		cnt--;	
	}

	cnt = K;

	while (sz(sz) and cnt) {
		us[prev(sz.end())->S] = 1;
		sz.erase(prev(sz.end()));
		cnt--;
	}

	vector<int> inc;

	for (int i = 0; i < n; i++) {
		if (us[i]) inc.pb(i);
	}

	int ans = -1;

	for (int i = 0; i < sz(inc); i++) {
		for (int j = 0; j < sz(inc); j++) {
			for (int l = 0; l < sz(inc); l++) {
				int f = inc[i];
				int s = inc[j];
				int t = inc[l];

				if (x[f] <= x[s] or x[f] <= x[t]) continue;
				if (y[s] <= y[f] or y[s] <= y[t]) continue;
				if (z[t] <= z[s] or z[t] <= z[f]) continue;

				ans = max(ans, x[f] + y[s] + z[t]);
			}
		}
	}

	cout << ans << endl;

	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...
#Verdict Execution timeMemoryGrader output
Fetching results...