提交记录
#include <cstdio>
#include <algorithm>
#include <set>
using namespace std;
int N, K;
struct SetPoint{
int x, y;
inline bool operator<(const SetPoint& b)const{
return y<b.y;
};
};
struct Point{
int x, y;
set<SetPoint>::iterator iter;
inline bool operator<(const Point& b)const{
return x<b.x;
};
} Points[50000];
int main(){
scanf("%d%d",&N,&K);
for(int i=0; i<N; ++i){
int xi, yi;
scanf("%d%d",&xi,&yi);
Points[i] = {xi,yi};
}
sort(Points, Points+N);
int scanLine = -1000000000;
int nextIn = 0, nextOut = 0;
set<SetPoint> s;
long long ans = 0;
while(nextIn<N){
int d1 = Points[nextOut].x-scanLine;
int d2 = Points[nextIn].x-(scanLine+K);
if(d1 <= d2){
scanLine += d1;
s.erase(Points[nextOut++].iter);
}else{
int x = Points[nextIn].x, y = Points[nextIn].y;
scanLine += d2;
SetPoint tp = {0, y-K};
set<SetPoint>::iterator iter = s.begin();
while(true){
iter = upper_bound(iter, s.end(), tp);
if(iter==s.end() || (*iter).y>=y+K){
Points[nextIn].iter = s.insert({x, y}).first;
break;
}else{
if(ans){
ans = -1;
break;
}
ans = (K-x+(*iter).x)*(K-abs(y-(*iter).y));
++iter;
}
}
if(ans==-1) break;
++nextIn;
}
}
printf("%lld\n", ans);
return 0;
}