题解 P2202 【[USACO13JAN]Square Overlap S】
蓝题吗?可能不那么难。
首先可以想到对于点
对于其他情况,计算重叠的次数特判即可。
此时复杂度为
考虑利用单调性,按
喜闻乐见的代码:
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y;
} pos[50001];
int n,k,num,ans;
bool cmp(node x,node y)
{
return x.x<=y.x;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d%d",&pos[i].x,&pos[i].y);
sort(pos+1,pos+1+n,cmp);
for(int i=1;i<=n;i++)
{
int l=i+1;
while(l<=n&&abs(pos[l].x-pos[i].x)<k)
{
if(abs(pos[l].y-pos[i].y)<k)
{
num++;
if(num==2)
{
puts("-1");
return 0;
}
ans=abs(k-abs(pos[i].x-pos[l].x))*abs(k-abs(pos[i].y-pos[l].y));
}
l++;
}
}
if(num)
cout<<ans;
if(num==0)
puts("0");
return 0;
}