求hack,悬 n 关(n > 1)
查看原帖
求hack,悬 n 关(n > 1)
929151
xxr___楼主2025/6/20 21:52
#include <iostream>
#include <algorithm>

const int N = 4e5 + 5;
int n,a[N],b[N];

struct lines{
	int l,r;
}l[N * 4];
struct bit_tr{
	int mx[N];
	inline void upd(int x,int v){
		while(x < N){
			mx[x] = std::max(mx[x],v);
			x += x & -x;
		}
	}
	inline int ask(int x){
		int Max = 0;
		while(x){
			Max = std::max(Max,mx[x]);
			x -= x & -x;
		}
		return Max;
	}
}bit;
int f[N];

int main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cin >> n;
	for(int i = 1;i <= n; ++ i){
		std::cin >> a[i] >> b[i];
	} 
	int m = n * 4;
	for(int i = 1;i <= n; ++ i){
		if(a[i] > b[i]){
			std::swap(a[i],b[i]);
		}
		l[i] = {a[i],b[i]};
		l[i + n] = {b[i],a[i] + 2 * n};
		l[i + 2 * n] = {a[i] + 2 * n,b[i] + 2 * n};
	}
	std::sort(l + 1,l + m + 1,[&](const lines & x,const lines & y){
		return x.l < y.l;
	});
	int Max = 1;
	for(int i = 1;i <= m; ++ i){
//		for(int j = l[i].r + 1;j <= m; ++ j){
//			f[l[i].r] = std::max(f[l[i].r],f[j] + 1);
//		}
		f[m - l[i].r + 1] = 1;
		if(m - l[i].r > 0) f[m - l[i].r + 1] = std::max(f[m - l[i].r + 1],bit.ask(m - l[i].r) + 1);
//		std::cout << m - l[i].r + 1 << '\n';
		bit.upd(m - l[i].r + 1,f[m - l[i].r + 1]);
	}
	for(int i = 1;i <= m; ++ i){
		Max = std::max(Max,f[i]); 
	}
	std::cout << Max; 
	return 0;
}
2025/6/20 21:52
加载中...