#pragma GCC optimize("O3") #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #pragma GCC target("avx,avx2") #include #define INF 1000000001LL #define LNF 1000000000000000001LL #define MOD 998244353LL #define MAX 2001 #define long long long #define all(x) x.begin(),x.end() using namespace std; //UnionFind class UnionFind { public: vector parent; vector cnt; void init(int size) { parent.resize(size); cnt.resize(size); for(int i = 0; i> h >> w >> n >> d; vector> pan(h,vector(w)); for(int i = 0; i> a >> b; a--;b--; pan[a][b] = 1; } UnionFind uf; uf.init(h*w); for(int i = 0; i= h || j+y >=w || i+x < 0 || j+y < 0 || abs(x)+abs(y) > d) continue; if(pan[i+x][j+y] == 0) continue; uf.merge(trans(i,j),trans(i+x,j+y)); } } } } int mx = -1; int mn = INF; for(int i = 0; i s; for(int x = -d; x<=d; x++) { for(int y = -d; y<=d; y++) { if(i+x >= h || j+y >=w || i+x < 0 || j+y < 0 || abs(x)+abs(y) > d) continue; if(pan[i+x][j+y] == 0) continue; s.insert(uf.find(trans(i+x,j+y))); } } int cnt = 0; bool one = false; for(int p : s) { if(uf.cnt[uf.find(p)] != 1) cnt++; one |= uf.cnt[uf.find(p)] == 1; } if(cnt > 1) cnt--; else if(cnt == 0 && one) cnt = -1; else if(cnt == 1) cnt = 0; mx = max(mx,cnt); mn = min(mn,cnt); } } int cnt = 0; for(int i = 0; i