Pro
Sol
这个题没什么技巧,跟着题目做就能过,主要是式子推的比较麻烦。两个地方需要推式子来算,就是判断是否重叠和计算重叠面积的时候。我们按照横坐标排序,每一次只取出可能与该点有重叠的矩形(左边界比当前矩形的右边界小的矩形),确定了横坐标再确定纵坐标,纵坐标分两种情况:右上方和右下方。自己根据两种情况手推出式子来,就能求解了。
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct Node {
int x , y;
bool operator < (const Node &a) const {
return x < a.x;
}
};
Node map[50005];
int n , k , cnt , top = 2 , ans;
int myabs(int a) {
return a>0?a:(-a);
}
int jud(int x , int y) {
if(map[y].y > map[x].y && map[y].y-k/2<map[x].y+k/2)
return 1;
if(map[y].y < map[x].y && map[y].y+k/2>map[x].y-k/2)
return 1;
return 0;
}
int qarea(int x , int y) {
if(map[x].y > map[y].y) {
int len1 = map[y].y-map[x].y+k , len2 = map[x].x-map[y].x+k;
return len1*len2;
}
if(map[x].y < map[y].y) {
int len1 = map[x].y-map[y].y+k , len2 = map[x].x-map[y].x+k;
return len1*len2;
}
}
int main() {
scanf("%d%d",&n,&k);
for(int i=1; i<=n; i++)
scanf("%d%d",&map[i].x,&map[i].y);
sort(map+1 , map+n+1);
for(int i=1; i<=n; i++)
for(int j=i+1; j<=n; j++) {
if(map[j].x-k/2 >= map[i].x+k/2)
break;
if(i != j && jud(i , j)) {
cnt++;
if(cnt > 1) {
printf("-1");
return 0;
}
ans = qarea(i , j);
}
}
if(!cnt)
printf("0");
else
printf("%d",ans);
return 0;
}