题目:
https://www.luogu.org/problemnew/show/2309
%%%伟大的dc学长;
逆序对板子题;
在最前面放一个0,在求逆序对时顺便把正数个数给求了;
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef long long ll;
const ll MAXN=3000001 + 9;
ll a[MAXN],sum[MAXN],b[MAXN];
ll ans,n;
void merge_sort(ll l,ll r)
{
if(l==r) return;
ll mid=(l+r)>> 1,i=l,k=l,j=mid+1;
merge_sort(l,mid),merge_sort(mid+1,r);
while(i<=mid && j<=r)
if(a[i]>a[j]) b[k++]=a[j++],ans+=mid-i+1;
else b[k++]=a[i++];
while(i<=mid) b[k++]=a[i++];
while(j<=r) b[k++]=a[j++];
for(int i=l;i<=r;i++) a[i]=b[i];
return;
}
void solve()
{
scanf("%lld",&n),n++;
for(ll i=2;i<=n;i++)
{
scanf("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];
}
for(ll i=1;i<=n;i++) a[i]=sum[n-i+1];
merge_sort(1,n);
cout<<ans;
return;
}
int main()
{
solve();
return 0;
}