제출 #1361554

#제출 시각아이디문제언어결과실행 시간메모리
1361554Jawad_Akbar_JJTeam Contest (JOI22_team)C++20
100 / 100
730 ms106380 KiB
#include <iostream>
#include <vector>
#include <array>
#include <map>
#include <algorithm>

using namespace std;
const int N = 1<<19;
array<int, 3> A[N];
vector<int> ft[N], vec[N];
int Mx[N], Z[N], inv[N], cur, Ans;



void solve(int n){
	for (int i=1;i<=n;i++){
		swap(A[i][1], A[i][2]);

		int y = A[i][1], &z = Z[i];

		for (int j=y-1; j ; j -= j & -j)
			z = max(z, Mx[j]);
		for (int j=y; j < N; j += j & -j)
			Mx[j] = max(Mx[j], A[i][2]);


		if (z > A[i][2]){
			for (int j=y; j; j -= j & -j)
				vec[j].push_back(z);
		}
	}



	for (int i=1;i<N;i++){
		sort(begin(vec[i]), end(vec[i]));
		vec[i].resize(unique(begin(vec[i]), end(vec[i])) - begin(vec[i]));
		ft[i].resize(vec[i].size() + 1, 0);
	}



	for (int i=1, j = 1;i<=n;i = j){
		while (j <= n and A[i][0] == A[j][0])
			j++;

		for (int k=i;k<j;k++){
			auto [x, y, z] = A[k];
			
			int mx = 0;
			for (int I=y+1;I < N; I += I & -I){
				int J = upper_bound(begin(vec[I]), end(vec[I]), z-1) - begin(vec[I]);
				if (vec[I].size() != 0 and vec[I][J] == z)
					J++;
				J++;
				for (J += !J; J < ft[I].size(); J += J & -J)
					mx = max(mx, ft[I][J]);
			}

			if (mx > 0)
				Ans = max(Ans, mx + inv[x]);
		}

		for (int k=i;k<j;k++){
			if (Z[k] <= A[k][2])
				continue;
			int y = A[k][1], z = Z[k];
			for (int I=y; I ; I -= I & -I){
				int J = upper_bound(begin(vec[I]), end(vec[I]), z) - begin(vec[I]);
				for (; J ; J -= J & -J)
					ft[I][J] = max(ft[I][J], inv[z] + inv[y]);
			}
		}
	}

	for (int i=1;i<N;i++){
		ft[i].clear();
		vec[i].clear();
		Mx[i] = Z[i] = 0;
	}

}

map<int, int> mp, mp2;
int main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	int n;
	cin>>n;

	
	for (int i=1;i<=n;i++){
		for (int &j : A[i])
			cin>>j, mp[j];
	}
	sort(A + 1, A + n + 1);

	for (auto [i, j] : mp)
		mp2[i] = ++cur, inv[cur] = i;

	for (int i=1;i<=n;i++){
		for (int &j : A[i])
			j = mp2[j];
	}

	solve(n);
	solve(n);

	cout<<Ans - !Ans<<endl;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…