洛谷P2906 [USACO08OPEN]牛的街区Cow Neighborhoods
曼哈顿距离转切比雪夫距离
1 #include <bits/stdc++.h> 2 #define LL long long 3 #define GG int 4 #define For(i, j, k) for(register int i=j; i<=k; i++) 5 #define Dow(i, j, k) for(register int i=j; i>=k; i--) 6 using namespace std; 7 GG read() { 8 GG x = 0, f = 1; 9 char ch = getchar(); 10 while(ch<‘0‘||ch>‘9‘) { if(ch==‘-‘) f = -1; ch = getchar(); } 11 while(ch>=‘0‘&&ch<=‘9‘) { x = x*10+ch-48; ch = getchar(); } 12 return x * f; 13 } 14 void write(GG x) { 15 if(x<0) putchar(‘-‘), x = -x; 16 if(x>9) write(x/10); 17 putchar(x%10+48); 18 } 19 void writeln(GG x) { write(x); putchar(‘\n‘); } 20 21 const int N = 100011; 22 struct node{ 23 LL x,y; 24 int id; 25 }a[N]; 26 int n,C, Mx, ans; 27 int fa[N], tot[N]; 28 multiset<node> s; 29 multiset<node> ::iterator it; 30 31 bool cmp_x(node a, node b) { return a.x < b.x; } 32 bool operator <(node a,node b) { 33 return a.y < b.y; 34 } 35 36 int find(int x) { 37 if(fa[x] == x) return x; 38 return fa[x] = find(fa[x]); 39 } 40 41 void Union(int x, int y) { 42 x = find(x); y = find(y); 43 if(x==y) return; 44 if(tot[x] < tot[y]) swap(x, y); 45 fa[y] = x; tot[x] += tot[y]; 46 --ans; 47 } 48 49 void work() { 50 sort(a+1, a+n+1, cmp_x); 51 int h = 1; 52 s.insert(a[1]); 53 s.insert( (node){0ll, 1e10, 0 } ); 54 s.insert( (node){0ll, -1e10, 0 } ); 55 For(i, 2, n) { 56 while(a[i].x-a[h].x > C) s.erase( s.find(a[h]) ), ++h; 57 it = s.lower_bound(a[i]); 58 node p = *it; 59 if(p.y-a[i].y <= C) Union(a[i].id, p.id); 60 --it; p = *it; 61 if(a[i].y-p.y <= C) Union(a[i].id, p.id); 62 s.insert(a[i]); 63 } 64 } 65 66 int main() { 67 n = read(); C = read(); 68 For(i, 1, n) { 69 int x=read(), y=read(); 70 a[i].x = x+y; a[i].y=x-y; 71 a[i].id = i; 72 } 73 For(i, 1, n) fa[i] = i, tot[i]=1; 74 ans = n; 75 work(); 76 For(i, 1, n) Mx = max(Mx, tot[i]); 77 printf("%d %d\n", ans, Mx); 78 /* 79 For(i, 1, n) fa[i] = find(fa[i]); 80 sort(fa+1, fa+n+1); 81 fa[0] = fa[1]+1; 82 int num = 0, len = 0, Mx = 0; 83 For(i, 1, n) 84 if(fa[i] != fa[i-1]) { 85 if(len > Mx) Mx = len; 86 len = 1; 87 ++num; 88 } 89 else ++len; 90 if(len>Mx) Mx = len; 91 printf("%d %d\n", num, Mx); 92 */ 93 }