37分求助
查看原帖
37分求助
728910
Asedwai楼主2023/4/1 16:08
#include <bits/stdc++.h>

using namespace std;

#define LL long long
const auto Maxn = (LL) 1e5 + 10;


struct tree_Segment {
	struct Tree_node {
		int sum, l, r, lz; 
	};
	Tree_node s[Maxn * 4]; 
	
	inline void build(int i, int l, int r) {
		s[i].l = l, s[i].r = r; 
		s[i].sum = 0; 
		if(l == r) 
			return ; 
		int mid = l + r >> 1; 
		build(i * 2, l, mid); 
		build(i * 2 + 1, mid + 1, r); 
	}
	
	inline int search(int i, int l, int r) {
		if(s[i].l >= l && s[i].r <= r) 
			return s[i].sum; 
		int ans = 0; 
		if(s[i * 2].r >= l) ans += search(i * 2, l, r); 
		if(s[i * 2 + 1].l <= r) ans += search(i * 2 + 1, l, r); 
		return ans; 
	}
	
	inline void change(int i, int x, int v) {
		if(s[i].l == s[i].r) {
			s[i].sum += v; 
			return ; 
		}
		int mid = s[i].l + s[i].r >> 1; 
		if(x <= mid) change(i * 2, x, v); 
		else change(i * 2 + 1, x, v); 
		s[i].sum = s[i * 2].sum + s[i * 2 + 1].sum; 
	}
	
}s;

void lsh(LL *l, int n) {
	LL t[n + 1]; 
	for(int i = 1; i <= n; i++) t[i] = l[i]; 
	sort(t + 1, t + n + 1); 
	n = unique(t + 1, t + n + 1) - t; 
	for(int i = 1; i <= n; i++) l[i] = lower_bound(t + 1, t + n + 1, l[i]) - t; 
}



int n; 
LL a[Maxn]; 
LL sum; 
LL la[Maxn], ra[Maxn]; 

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	cin >> n; 
	for(int i = 1; i <= n; i++) 
		cin >> a[i]; 
	lsh(a, n);
//	for(int i = 1; i <= n; i++) 
//		cout << a[i] << " "; 
//	cout << endl; 
	
	s.build(1, 1, Maxn); 
	
	for(int i = 1; i <= n; i++) {
		s.change(1, a[i], 1); 
		if(a[i] > 1) 
			la[i] = s.search(1, 1, a[i] - 1); 
	}
	s.build(1, 1, Maxn); 
	
	for(int i = n; i >= 1; i--) {
		s.change(1, a[i], 1); 
		if(a[i] < n) 
			ra[i] = s.search(1, a[i] + 1, Maxn);
	}
	for(int i = 2; i < n; i++) {
//		cout << a[i] << " : " << la[i] << " " << ra[i] << endl; 
		sum += la[i] * ra[i];
		
	}
	cout << sum; 
	return 0; 
}
2023/4/1 16:08
加载中...