为啥0分
查看原帖
为啥0分
439609
封禁用户楼主2024/1/25 20:35

不就是求顺序对吗?

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,a[100005],s[100005],t[100005],tree[100005],ans,k;
int lowbit(int x)
{
	return x&-x;
}
void add(int x,int y)
{
	while(x<=n)
	{
		tree[x]+=y;
		x+=lowbit(x);
	}
}
int query(int x)
{
	int ans=0;
	while(x!=0)
	{
		ans+=tree[x];
		x-=lowbit(x);
	}
	return ans;
}
int main()
{
	scanf("%lld%lld",&n,&k);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
		a[i]-=k;
		s[i]=s[i-1]+a[i];
	}
	n++;
	for(int i=1;i<=n;i++) t[i]=s[i-1];
	sort(t+1,t+n+1);
	int len=unique(t+1,t+n+1)-(t+1);
	for(int i=1;i<=n;i++) a[i]=lower_bound(t+1,t+n+1,a[i])-t;
	for(int i=1;i<=n;i++)
	{
		add(a[i],1);
		ans+=i-query(a[i]);
	}
	printf("%lld",n*(n-1)/2-ans);
	return 0;
}
2024/1/25 20:35
加载中...