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;
}
浙公网安备 33010602011771号