제출 #881782

#제출 시각아이디문제언어결과실행 시간메모리
881782HakiersTeam Contest (JOI22_team)C++17
9 / 100
220 ms5940 KiB
#include <bits/stdc++.h>
using namespace std;
constexpr int BASE = 1 << 18;
struct cord{
	int x, y, z;
};
map<int, int> mapa[2];
int translate[2][BASE];
pair<int, int> TREE[2][BASE<<1];
cord INPUT[BASE];
int n;

bool cmp(cord a, cord b){
	
	if(a.z != b.z)
		return a.z < b.z;
	else if(a.x != b.x)
		return a.x < b.x;
		
	return a.y < b.y;
}

void scale(){
	int pos = 0;
	for(auto it = mapa[0].begin(); it != mapa[0].end(); ++it){
		it->second = ++pos;
		translate[0][pos] = it->first;
	}
		
	pos = 0;
	for(auto it = mapa[1].begin(); it != mapa[1].end(); ++it){
		it->second = ++pos;
		translate[1][pos] = it->first;
	}

	for(int i = 1; i <= n; i++){
		INPUT[i].x = mapa[0][INPUT[i].x];
		INPUT[i].y = mapa[1][INPUT[i].y];
	}
}

pair<int, int> merge(pair<int, int> a, pair<int, int> b){
	if(a.first != b.first)
		return max(a, b);
	else if(a.second < b.second)
		return a;
	
	return b;
}

void update(int v, int val, int t){
	v += BASE;
	TREE[t][v] = max(TREE[t][v], {val, v-BASE});
	v/=2;

	while(v > 0){
		int l = 2*v, r = 2*v+1;
		TREE[t][v] = merge(TREE[t][l], TREE[t][r]);
		v/=2;
	}
}

pair<int, int> query(int a, int b, int t){
	a += BASE - 1;
	b += BASE + 1;
	pair<int, int> res = {0, 0};
	
	while(a/2 != b/2){
		if(a%2 == 0) res = merge(res, TREE[t][a+1]);
		if(b%2 == 1) res = merge(res, TREE[t][b-1]);
		a/=2; b/=2;
	}

	return res;
}

bool check(int mid, cord a){
	pair<int, int> maxX = query(a.y, mid, 0);
	if(maxX.first <= a.x) return true;
	
	pair<int, int> maxY = query(a.x, maxX.first - 1, 1);
	if(maxY.first <= maxX.second) return false;
	
	return true;
}

int BS(cord a){
	int l = a.y +1, r = BASE - 1, mid;
	
	while(l < r){
		mid = (l +r)/2;
		if(check(mid, a)) l = mid+1;
		else r = mid;
	}
	
	if(!check(l, a)) l--;
	
	pair<int, int> maxX = query(a.y, l, 0);
	//cout << "maxX " << maxX.first << "\n";
	if(maxX.first <= a.x) return -1;
	pair<int, int> maxY = query(a.x, maxX.first - 1, 1);
	if(maxY.first <= maxX.second) return -1;
	//cout << "maxY " << maxY.first << "\n";
	return a.z + translate[0][maxX.first] + translate[1][maxY.first];
	//return 0;
}

int solve(){
	int res = -1;
	for(int i = 1; i <= n; i++){
		//cerr << "x " << INPUT[i].x << " y " << INPUT[i].y << " z " << INPUT[i].z << "\n";
		res = max(res, BS(INPUT[i]));
		update(INPUT[i].y, INPUT[i].x, 0);
		update(INPUT[i].x, INPUT[i].y, 1);
	}
	
	return res;
}

int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cin >> n;
	
	for(int i = 1; i <= n; i++){
		cin >> INPUT[i].x >> INPUT[i].y >> INPUT[i].z;
		mapa[0][INPUT[i].x];
		mapa[1][INPUT[i].y];
	}
	scale();
	sort(INPUT + 1, INPUT + n + 1, cmp);
	cout << solve() << "\n";
}

#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...