제출 #1282347

#제출 시각아이디문제언어결과실행 시간메모리
1282347duyanhchupapiTeam Contest (JOI22_team)C++20
0 / 100
2094 ms5320 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std; 
using ll = long long; 
const int N = 150005;
int n, inf = 1e9, ans = -1;

struct kid {
	int x,y,z;
} p[N];
vector <int> nen;
int seg[4*N], bit[N], luu[4*N];

void update(int id, int val) {
	while(id <= n) bit[id] = max(bit[id], val), id += -id&id;
}

int get(int id) {
	int res = -1;
	while(id > 0) res = max(res, bit[id]), id -= -id&id;
	return res;
}

void up(int x, int l, int r, int id, int w) {
	if(l == r) {
		int vl = nen[id] + w;
		if(seg[x] < vl || (seg[x] == vl && luu[x] < w))
			seg[x] = vl, luu[x] = w;
		return;
	}
	int m = (l + r)/2;
	if(id <= m) up(2*x,l,m,id,w);
	else up(2*x+1,m+1,r,id,w);
	seg[x] = seg[2*x];
	luu[x] = luu[2*x];
	if(seg[x] < seg[2*x+1] || (seg[x] == seg[2*x+1] && luu[x] < luu[2*x+1])) 
		seg[x] = seg[2*x+1], luu[x] = luu[2*x+1];
}

pair <int,int> MAX(int x, int l, int r, int i, int j) {
	if(l > j || r < i) return make_pair(-1,-1);
	if(l >= i && r <= j) return make_pair(seg[x], luu[x]);
	int m = (l + r)/2;
	pair <int,int> res = MAX(2*x,l,m,i,j);
	pair <int,int> RES = MAX(2*x+1,m+1,r,i,j);
	if(res.fi > RES.fi || (res.fi == RES.fi && res.se > RES.se)) return res;
	return RES;
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
	cin >> n;
	fill(seg, seg+4*n+1, -1);
	for(int i=1;i<=n;++i) cin >> p[i].x >> p[i].y >> p[i].z, nen.push_back(p[i].y);
	sort(p+1,p+n+1, [&](const kid & p1, const kid & p2) {
		if(p1.x != p2.x) return p1.x < p2.x;
		else if(p1.y != p2.y) return p1.y < p2.y;
		return p1.z < p2.z;
	});
	//cout << '\n';
	//for(int i=1;i<=n;++i) cout << p[i].x << ' ' << p[i].y << ' ' << p[i].z << '\n'; cout << '\n';
	nen.push_back(0);
	sort(nen.begin(), nen.end());
	nen.erase(unique(nen.begin(), nen.end()), nen.end());
	for(int i=1;i<=n;++i) {
		p[i].y = lower_bound(nen.begin(), nen.end(), p[i].y) - nen.begin();
	}

	set <int> ms;
	int j = 1;
	for(int i=1;i<=n;++i) {
		while(p[i].x == p[j].x) ++j;
		if(!ms.empty()) {
			for(int id=i;id<j;++id) {
				int Y = p[id].y, Z = p[id].z;
				auto it = ms.upper_bound(Y);
				if(it == ms.end()) continue;
				int yi = *it;
 				pair <int,int> kq = {-1,-1};
 				if(yi <= n) kq = MAX(1,1,n,yi,n); 
 				if(kq.se > Z) ans = max(ans, p[i].x + kq.fi);
 				//cout << id << ' ' << yi << ' ' << kq.fi << ' ' << kq.se << '\n';
			}
		}
		
		for(int id=i;id<j;++id) {
			int Y = p[id].y, Z = p[id].z;
			update(Y, Z);
			int val = get(Y - 1);
			if(val > Z) up(1,1,n,Y,val);
			ms.insert(Y);	
		}
		// cout << ans << '\n';
	}
	
	cout << ans;
	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...