chenfy27的刷题记录

导航

luoguP1637 三元上升子序列

给定n个整数的序列A,求存在多少个三元上升子序列,即满足i<j<k并且a[i]<a[j]<a[k]。

分析:用平衡树维护两侧元素,然后枚举中间元素即可。

#include <bits/stdc++.h>
using i64 = long long;

// Treap模板...

void solve() {
	int n;
	std::cin >> n;
	std::vector<int> A(n);
	for (int i = 0; i < n; i++) {
		std::cin >> A[i];
	}
	Treap<int> tr1(n,1,0), tr2(n,1,0);
	for (int i = 0; i < n; i++) {
		tr2.insert(A[i]);
	}
	i64 ans = 0;
	for (int i = 0; i < n; i++) {
		tr2.erase(A[i]);
		ans += 1LL * tr1.ltcnt(A[i]) * tr2.gtcnt(A[i]);
		tr1.insert(A[i]);
	}
	std::cout << ans << "\n";
}

int main() {
	std::cin.tie(0)->sync_with_stdio(0);
	int t = 1;
	while (t--) solve();
	return 0;
}

posted on 2024-07-14 12:50  chenfy27  阅读(15)  评论(0)    收藏  举报