제출 #224031

#제출 시각아이디문제언어결과실행 시간메모리
224031crimsonredMountains (NOI20_mountains)C++17
100 / 100
1751 ms55520 KiB
#include <bits/stdc++.h>
using namespace std;

#define mod 1'000'000'007
typedef long long ll;

template<typename T>
void deb(initializer_list<T> l)
{
	for (auto &e : l)
		cout << e << ' ';
	cout << endl;
}

struct SegmentTree
{
	vector<ll> st;

	void build(vector<ll>& a, ll n)
	{
		st.resize(2 * n, 0);
		for (ll i = n; i < 2 * n; ++i)
			st[i] = a[i - n];
		for (ll i = n - 1; i > 0; --i)
			st[i] = st[2 * i] + st[2 * i + 1];
	}

	void update(ll idx, ll val, ll n)
	{
		idx += n;
		st[idx] += val;
		for (idx /= 2; idx; idx /= 2)
			st[idx] = st[2 * idx] + st[2 * idx + 1];
	}

	ll query(ll left, ll right, ll n)
	{
		left += n;
		right += n;
		ll sum = 0;
		while (left < right)
		{
			if (left % 2 == 1)
			{
				sum += st[left];
				++left;
			}
			if (right % 2 == 1)
			{
				--right;
				sum += st[right];
			}
			left /= 2;
			right /= 2;
		}
		return sum;
	}
};

void solve()
{
	ll n;
	cin >> n;
	vector<ll> a(n);
	set<ll> s;
	for (auto &e : a)
	{
		cin >> e;
		s.insert(e);
	}

	map<ll, ll> m;
	ll num = 0;
	for (auto &e : s)
		m[e] = num++;

	vector<ll> left(n, 0), right(n, 0);
	++left[m[a[0]]];
	for (ll i = 1; i < n; ++i)
		++right[m[a[i]]];

	SegmentTree l, r;
	l.build(left, n);
	r.build(right, n);

	ll ans = 0;
	for (ll i = 1; i < n - 1; ++i)
	{
		r.update(m[a[i]], -1, n);
		ans += l.query(0, m[a[i]], n) * r.query(0, m[a[i]], n);
		l.update(m[a[i]], 1, n);
	}
	cout << ans << '\n';
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);

	int t = 1;
	// cin >> t;
	while (t--)
		solve();

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...