AcWing 楼蓝图腾(树状数组维护逆序对)
Posted mb62d0ca5a0a625
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing 楼蓝图腾(树状数组维护逆序对)相关的知识,希望对你有一定的参考价值。
链接
题意:
给出你一段序列,让你找出yig9ong多少先增后减和多少先减后增的三元组。
分析:
用树状数组维护逆序对。先正序维护一个逆序对,再倒序维护逆序对,两两相乘再求和即可。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn= 2e5+7;
ll n;
ll a[maxn];
ll tree[maxn];
ll lowbit(ll x)
return x&(-x);
void update(ll x,ll d)
while(x<=n)
tree[x]+=d;
x+=lowbit(x);
ll query(ll x)
ll ans=0;
while(x>0)
ans+=tree[x];
x-=lowbit(x);
return ans;
ll l[maxn],r[maxn];
int main()
scanf("%lld",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
l[i]=query(a[i]-1);
r[i]=query(n)-query(a[i]);
update(a[i],1);
ll ans1=0;
ll ans2=0;
memset(tree,0,sizeof tree);
for(int i=n;i>=1;i--)
ans1+=l[i]*query(a[i]-1);
ans2+=r[i]*(query(n)-query(a[i]));
update(a[i],1);
cout<<ans2<<" "<<ans1<<endl;
return 0;
以上是关于AcWing 楼蓝图腾(树状数组维护逆序对)的主要内容,如果未能解决你的问题,请参考以下文章
CCPC河南省赛B-树上逆序对| 离线处理|树状数组 + 线段树维护逆序对 + dfs序 + 离散化
Another Version of Inversion 二维树状数组求逆序对