z=3求调
查看原帖
z=3求调
776799
GODTREE楼主2024/1/20 10:03
#include <bits/stdc++.h>
using namespace std;
#define int long long
int b,n,d,m,cnt;
struct p_2
{
	int x,y;
};
struct p_3
{
	int x,y,z;
};
bool cmp2(p_2 a,p_2 b)
{
	return a.x<b.x;
}
bool cmp3(p_3 a,p_3 b)
{
	return a.z<b.z;
}
void solve1()
{
	int a[1000005],j=1;
	memset(a,0,sizeof(a));
	for (int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	sort(a+1,a+n+1);
	for(int i=1; i<=n;i++)
	{
		while(a[i]-a[j]>d&&j<i)
		{
			j++;
		} 
		cnt+=i-j;
	}
	return ;
}
namespace solve2
{
	p_2 a[100005];
	int bit[75000 * 2];
	int lowbit(int x)
	{
		return x&(-x);
	}
	void add(int x, int y) 
	{
		while(x<=2*75000) 
		{
			bit[x]+=y;
			x+=lowbit(x);
		}
	}
	int sum(int x) 
	{
		x=min(x,(int)(75000*2-1));
		int res=0;
		while(x>0)
		{
			res+=bit[x];
			x-=lowbit(x);
		}
		return res;
	}
    int main() 
	{
		for (int i = 1; i <= n; ++i) 
		{
			int x,y;
			cin>>x>>y;
			a[i].x=x+y,a[i].y=x-y;
		}
		sort(a+1,a+n+1,cmp2);
		for (int i=1,j=1;i<=n;i++) 
		{
			while (j<i&&a[i].x-a[j].x>d) 
			{
				add(a[j].y+m,-1);
				j++;
			}
			cnt+=sum(a[i].y+d+m)-sum(a[i].y-d-1+m);
			add(a[i].y+m,1);
		}
		return 0;
	}
}
namespace solve3
{
	p_3 a[100005];
	int sum[105][105][80];
	int lim(int num)
	{
		return min((int)(105),max(num,(int)(0)));
	}
	int cnt_square(int x,int y,int z,int q)
	{ 
		return sum[lim(x+d-q)][lim(y+d-q)][lim(z)]-sum[lim(x-d-q)][lim(y)][lim(z)]-sum[lim(x)][lim(y-d-q)][lim(z)]+sum[lim(x-d-q)][lim(y-d-q)][lim(z)];
	}
	signed main()
	{
		for (int i=1;i<=n;i++)
		{
			int x,y,z;
			cin>>x>>y>>z;
			a[i].x=x+y;
			a[i].y=x-y+75;
			a[i].z=z;
			sum[a[i].x][a[i].y][a[i].z]++;
		}
		for (int i=1;i<=151;i++)
		{
			for (int j=1;j<=151;j++)
			{
				for (int k=1;k<=75;k++)
				{
					sum[i][j][k]=sum[i-1][j][k]+sum[i][j-1][k]-sum[i-1][j-1][k];
				}
			}
		}
		sort(a+1,a+n+1,cmp3);
		for (int i=1;i<=n;i++)
		{
			for (int j=a[i].z-1;j>=1;j--)
			{
				cnt+=cnt_square(a[i].x,a[i].y,j,a[i].z-j);
			}
		}
		for (int i=1;i<=n;i++)
		{
			cnt+=cnt_square(a[i].x,a[i].y,a[i].z,0);
		}
		return 0;
	}
}
signed main()
{
	cin>>b>>n>>d>>m;
	if (b==1)solve1();
	if (b==2)solve2::main();
	if (b==3)solve3::main();
	cout<<cnt;
	return 0;
}
2024/1/20 10:03
加载中...