树状数组求调
查看原帖
树状数组求调
169606
Jason12楼主2022/8/18 10:02

按照第一篇题解写的:

#include <bits/stdc++.h>
  using namespace std;
int n,m,l,tt;
long long s[300005],ans;
struct xy{
	int x,y,z;
}a[300005],b[300005],t[600005];
bool cmp1(xy u,xy v)
{
	return u.x<v.x;
}
bool cmp2(xy u,xy v)
{
	if (u.y==v.y) return u.x<v.x;
	return u.y<v.y;
}
bool cmp3(xy u,xy v)
{
	if (u.y==v.y) return u.x<v.x;
	return u.y<v.y;
}
void Addpair(int u,int v)
{
	t[++l].x=min(a[u].x,a[v].x);
	t[l].y=max(a[u].x,a[v].x);
}
void Add(int t,long long u)
{
	for (int j=t;j<=n;j+=j&(-j))
	{
		s[j]+=1ll*u;
	}
}
long long getsum(int t)
{
	long long ans=0;
	for (int j=t;j;j-=j&(-j))
	{
		ans+=s[j];
	}
	return ans;
}
signed main()
{
	ios::sync_with_stdio(0); cout.tie(nullptr);
	cin>>n>>m;
	if (n==1)
	{
		cout<<0<<endl;
		return 0;
	}
	for (int i=1;i<=n;i++)
	{
		cin>>a[i].x;
		a[i].y=i;
	}
	sort(a+1,a+n+1,cmp1);
	Addpair(1,2);
	Addpair(n-1,n);
	for (int i=2;i<n;i++)
	{
		if (a[i].x-a[i-1].x==a[i+1].x-a[i].x)
		{
			Addpair(i-1,i);
			Addpair(i,i+1);
		}
		else if (a[i].x-a[i-1].x<a[i+1].x-a[i].x) Add(i,i-1);
		else Add(i,i+1);
	}
	sort(t+1,t+l+1,cmp2);
	for (int i=1;i<=m;i++)
	{
		cin>>b[i].x>>b[i].y;
		b[i].z=i;
	}
	sort(b+1,b+m+1,cmp3);
	tt=1;
	for (int i=1;i<=m;i++)
	{
		while (t[tt].y<=b[i].y && tt<=l) Add(t[tt++].y,1);
		ans+=1ll*b[i].z*(tt-1-getsum(b[i].x-1));
	}
	cout<<ans<<endl;
	return 0;
}
2022/8/18 10:02
加载中...