ARC194B题解
首先贪心地考虑(好吧我是看样例看出来的),按照数值从大到小的顺序来操作。即先将更大的数排到它应该去的位置。
然后我们考虑对于每一个数它产生的代价。对于第
然后我们考虑
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
const int MAXN = 2e5+5;
ll n;
ll p[MAXN];
ll qd[MAXN]; //前面的大于 p[i] 的个数
pll ps[MAXN];
//树状数组
ll lowbit(ll x)
{
return (x&(-x));
}
ll c[MAXN];
ll Sum(ll x)
{
ll sum = 0;
for(ll i = x;i > 0;i -= lowbit(i))
{
sum += c[i];
}
return sum;
}
void modify(ll x,ll k)
{
for(ll i = x;i <= n;i += lowbit(i))
{
c[i] += k;
}
return;
}
int main()
{
scanf("%d", &n);
for(int i = 1;i <= n;i++)
{
scanf("%lld", &p[i]);
qd[i] = Sum(n) - Sum(p[i]);
modify(p[i], 1LL);
// 这两行就是计算在 p[i] 前面的大于 p[i] 的数的个数
ps[i] = pll(p[i], i);
}
sort(ps + 1, ps + n + 1);
ll ans = 0;
for(int i = 1;i <= n;i++)
{
//ps[i].second 对应前文的 i
//qd[ps[i].second] 对应前文的 x
//i 对应前文的 j
ll nowid = ps[i].second - qd[ps[i].second];
ans += ((nowid-1 + i) * (ll)abs(nowid - i) >> 1LL);
}
printf("%lld", ans);
return 0;
}