好像不能判断两个正方形的边重合...
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
int n , k , f[N * 3 * 4] , sum[N * 3 * 4] , v[N * 3 * 4] , maxi = -1e9 , mini = 1e9 , ans , mx = -1e9 , mn = 1e9;
struct node
{
int x , y , id;
int l , r , L , R;
} a[N];
#define ls (o << 1)
#define rs (o << 1 | 1)
inline void push_up (int o)
{
f[o] = max (f[ls] , f[rs]);
sum[o] = sum[ls] + sum[rs];
}
inline void tag (int o , int l , int r , int val)
{
f[o] += val;
sum[o] += (r - l + 1) * val;
v[o] += val;
}
inline void push_down (int o , int l , int r)
{
if (!v[o]) return ;
int mid = l + r >> 1;
tag (ls , l , mid , v[o]);
tag (rs , mid + 1 , r , v[o]);
v[o] = 0;
}
inline void change (int o , int l , int r , int x , int y , int val)
{
if (l == x && r == y) return tag (o , l , r , val);
int mid = l + r >> 1; push_down (o , l , r);
if (y <= mid) change (ls , l , mid , x , y , val);
else if (x > mid) change (rs , mid + 1 , r , x , y , val);
else change (ls , l , mid , x , mid , val) , change (rs , mid + 1 , r , mid + 1 , y , val);
push_up (o);
}
inline int query (int o , int l , int r , int x , int y)
{
if (l == x && r == y) return f[o];
int mid = l + r >> 1; push_down (o , l , r);
if (y <= mid) return query (ls , l , mid , x , y);
else if (x > mid) return query (rs , mid + 1 , r , x , y);
else return max (query (ls , l , mid , x , mid) , query (rs , mid + 1 , r , mid + 1 , y));
}
inline int Query (int o , int l , int r , int x , int y)
{
if (l == x && r == y) return sum[o];
int mid = l + r >> 1; push_down (o , l , r);
if (y <= mid) return Query (ls , l , mid , x , y);
else if (x > mid) return Query (rs , mid + 1 , r , x , y);
else return Query (ls , l , mid , x , mid) + Query (rs , mid + 1 , r , mid + 1 , y);
}
signed main ()
{
cin >> n >> k; k /= 2;
for (int i = 1; i <= n; i++)
{
cin >> a[i].x >> a[i].y , a[i].id = i;
maxi = max (maxi , a[i].x + k) , mini = min (mini , a[i].x - k);
mx = max (mx , a[i].y + k) , mn = min (mn , a[i].y - k);
a[i].l = a[i].y - k , a[i].r = a[i].y + k; a[i].L = a[i].x - k , a[i].R = a[i].x + k;
}
sort (a + 1 , a + n + 1 , [ ] (node x , node y) {
return x.l < y.l;
});
int p1 = 1 , p2 = 1 , tmp = 0 , ams = 0;
bool flag = 0;
for (int j = mn; j <= mx; j++)
{
if (flag) ans++;
while (p2 <= n && a[p2].r <= j)
{
int x = query (1 , mini , maxi , a[p2].L , a[p2].R);
if (x >= 2)
{
if (tmp - 1 > 0 && ans - 1 > 0) ams = (tmp - 1) * (ans - 1);
change (1 , mini , maxi , a[p2].L , a[p2].R , -1);
}
else change (1 , mini , maxi , a[p2].L , a[p2].R , -1);
p2++;
}
while (p1 <= n && a[p1].l <= j)
{
int x = query (1 , mini , maxi , a[p1].L , a[p1].R) , t = Query (1 , mini , maxi , a[p1].L , a[p1].R);
if (x >= 1 && t > 1)
{
// cerr << "DDDDDDDDDDDDDDDDDDDDDDDW";
if (flag) {cout << -1 << "\n"; exit (0);}
flag = 1 ; tmp = Query (1 , mini , maxi , a[p1].L , a[p1].R); ans++;
change (1 , mini , maxi , a[p1].L , a[p1].R , 1);
}
else change (1 , mini , maxi , a[p1].L , a[p1].R , 1);
p1++;
}
}
if (!flag) cout << 0;
else cout << ams;
cout << "\n";
return 0;
}
5 6
0 0
8 4
-2 1
0 7
-2 6
output:
20
myoutput:
-1