73分求调QWQ
查看原帖
73分求调QWQ
661984
Stone_Xz楼主2024/3/30 19:28
#include<bits/stdc++.h>
#define ls(x) (x * 2)
#define rs(x) (x * 2 + 1)
#define int long long
using namespace std;

const int N = 1e5 + 5;
int tree[N], a[N], n, m, p[N], ans, lt[N], rt[N];

void update(int root)
{
    tree[root] = tree[ls(root)] + tree[rs(root)];
}

void lazy(int lt, int rt, int root)
{
	if(p[root])
    {
		p[ls(root)] += p[root];
		p[rs(root)] += p[root];
		int mid = (lt + rt) / 2;
		tree[ls(root)] += (mid - lt + 1) * p[root];
		tree[rs(root)] += (rt - (mid + 1) + 1) * p[root];
		p[root] = 0;
	}
	return ;
}

void add(int lt, int rt, int root, int x, int y, int k)
{
	if(x <= lt && y >= rt)
    {
		tree[root] += (rt - lt + 1) * k;
		p[root] += k;
		return ;
	}
	lazy(lt, rt, root);
	int mid = (lt + rt) / 2;
	if(x <= mid) add(lt, mid, ls(root), x, y, k);
	if(y > mid) add(mid + 1, rt, rs(root), x, y, k);
	update(root);
	return ;
}

int get(int lt, int rt, int root, int x, int y)
{
	if(x <= lt && y >= rt)
		return tree[root];
	lazy(lt, rt, root);
	int mid = (lt + rt) / 2;
	int num = 0;
	if(x <= mid) num += get(lt, mid, ls(root), x, y);
	if(y > mid) num += get(mid + 1, rt, rs(root), x, y);
	return num;
}

signed main()
{
	cin >> n;
	for(int i = 1; i <= n; i++)
		cin >> a[i];
	for(int i = 1; i <= n; i++)
	{
	    if(a[i] > 1)
	       lt[i] = get(1, n, 1, 1, a[i] - 1);
	    add(1, n, 1, a[i], a[i], 1);
	}
	memset(tree, 0, sizeof tree);
	for(int i = n; i >= 1; i--)
	{
	    if(a[i] < 100000)
	       rt[i] = get(1, n, 1, a[i] + 1, 100000);
	    add(1, n, 1, a[i], a[i], 1);
	}
	for(int i = 1; i <= n; i++)
	   ans += lt[i] * rt[i];
	cout << ans;
	return 0;
}

自己调吐了,求大佬相助QWQ

2024/3/30 19:28
加载中...