zoukankan      html  css  js  c++  java
  • 洛谷P2906 [USACO08OPEN]牛的街区Cow Neighborhoods

    洛谷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('
    '); }
    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
    ", 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
    ", num, Mx); 
    92     */
    93 }
  • 相关阅读:
    Linux下安装软件遇见的问题汇总
    使用AlarmManager定期执行工作
    android打开文件、保存对话框、创建新文件夹对话框(转载)
    一些算法的整理
    安卓adb调试命令常见的问题
    java下的串口通信-RXTX
    Unity 协程运行时的监控和优化
    Unity3D 协程的介绍和使用
    游戏服务器:到底使用UDP还是TCP
    Unity 可重复随机数
  • 原文地址:https://www.cnblogs.com/third2333/p/8464760.html
Copyright © 2011-2022 走看看