救救,对拍没任何问题但喜提40分,求hack
查看原帖
救救,对拍没任何问题但喜提40分,求hack
6867
panjidongc楼主2025/2/6 22:42

在求逆序对的时候用了分块QAQ

#include<bits/stdc++.h>
using namespace std;

const int N=100005;
int b[N],id[N],be[N],f[N],g[N],n,m,d,k=1;
long long ans;

struct node
{
	int v,p;   //v:值,p:离散化前的位置
}a[N];

bool cmp1(node x,node y)
{
	return x.v<y.v;
}

bool cmp2(node x,node y)
{
	return x.p<y.p;
}

int main()
{
	int i,j;
	cin.tie(0)->sync_with_stdio(0);
	cin>>n>>m,n++,d=sqrt(n);
	for(i=1;i<n;i++)
		cin>>b[i],b[i]+=b[i-1]-m;  //前缀和
	a[n].p=n,id[n]=(n-1)/d+1;
	for(i=n-1;i>=1;i--)
		a[i].v=b[n-i],a[i].p=i,id[i]=(i-1)/d+1;
	for(i=1;i<=id[n];i++)
		be[i]=(i-1)*d+1;
	sort(a+1,a+n+1,cmp1);
	for(i=1;i<=n;i++)  //离散化
	{
		while(a[i].v==a[i+1].v)
			a[i++].v=k;
		a[i].v=k++;
	}
	sort(a+1,a+n+1,cmp2);
	for(i=1;i<=n;i++)  //分块统计
	{
		k=id[a[i].v];
		ans+=f[a[i].v]+g[k];
		for(j=be[k];j<=a[i].v;j++)
			f[j]++;
		for(j=1;j<k;j++)
			g[j]++;
	}
	cout<<ans<<'\n';
	return 0;
}

2025/2/6 22:42
加载中...