bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 曼哈顿生成树

  大致题意:统计平面上由曼哈顿距离小于等于c的点对组成联通块的个数。

  曼哈顿生成树的模板题。有关讲解:http://blog.csdn.net/acm_cxlove/article/details/8890003

  

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define MAXN 100100
#define MAXE MAXN*8
#define INF 0x3f3f3f3f
#define INFL 0x3f3f3f3f3f3f3f3fLL
typedef long long qword;
int n,m;
struct edge
{
        int x,y;
        qword d;
}e[MAXE];
int tope=-1;
bool cmp_d(edge e1,edge e2)
{
        return e1.d<e2.d;
}
int uf[MAXN];
int get_fa(int now)
{
        return uf[now]==now ? now : uf[now]=get_fa(uf[now]);
}
int comb(int x,int y)
{
        x=get_fa(x);
        y=get_fa(y);
        if (x==y)return false;
        uf[x]=y;
        return true;
}
struct point
{
        qword x,y;
        int id;
}pl[MAXN];
bool cmp_x(point p1,point p2)
{
        if (p1.x==p2.x)return p1.y>p2.y;
        return p1.x>p2.x;
}
void rotate1()
{
        for (int i=0;i<n;i++)
                pl[i].x=-pl[i].x;
}
void rotate2()
{
        for (int i=0;i<n;i++)
                pl[i].y=-pl[i].y;
}
void rotate3()
{
        for (int i=0;i<n;i++)
                swap(pl[i].x,pl[i].y);
}
qword h[MAXN],toph=-1;
qword tarr[MAXN];
int tarr_id[MAXN];
void Add_tarr(int pos,qword v,int id)
{
        while (pos<MAXN)
        {
                tarr[pos]=min(tarr[pos],v);
                if (v==tarr[pos])tarr_id[pos]=id;
                pos+=pos&(-pos);
        }
}
pair<qword,int> Qry_tarr(int pos)
{
        pair<qword,int> ret;
        ret.first=INFL;
        while (pos)
        {
                ret.first=min(ret.first,tarr[pos]);
                if (ret.first==tarr[pos])
                        ret.second=tarr_id[pos];
                pos-=pos&(-pos);
        }
        return ret;
}
void work()
{
        int i,j;
        toph=0;
        memset(tarr,0x3f,sizeof(tarr));
        for (i=0;i<n;i++)
                h[++toph]=pl[i].x-pl[i].y;
        sort(h+1,h+toph+1);
        toph=unique(h+1,h+toph+1)-h-1;
        sort(pl,pl+n,cmp_x);
        for (i=0;i<n;i++)
        {
                pair<qword,int> pr;
                qword t=pl[i].x-pl[i].y;
                t=lower_bound(h+1,h+toph+1,t)-h;
                pr=Qry_tarr(t);
                if (pr.first!=INFL)
                {
                        e[++tope].x=pl[i].id;
                        e[tope].y=pr.second;
                        e[tope].d=pr.first-pl[i].x-pl[i].y;
                }
                Add_tarr(t,pl[i].x+pl[i].y,pl[i].id);
        }
}
int is_root[MAXN],uf_size[MAXN];
int main()
{
        freopen("input.txt","r",stdin);
        //freopen("output.txt","w",stdout);
        int i,j,k,x,y,z;
        scanf("%d%d",&n,&m);
        for (i=0;i<n;i++)
        {
                scanf("%lld%lld",&pl[i].x,&pl[i].y);
                pl[i].id=i;
        }
        //1
        work();
        //2
        rotate3();
        work();
        rotate3();
        //3
        rotate2();
        rotate3();
        work();
        rotate3();
        rotate2();
        //4
        rotate2();
        work();
        rotate2();
        //5
        rotate2();
        rotate1();
        work();
        rotate1();
        rotate2();
        //6
        rotate1();
        rotate2();
        rotate3();
        work();
        rotate3();
        rotate2();
        rotate1();
        //7
        rotate1();
        rotate3();
        work();
        rotate3();
        rotate1();
        //8
        rotate1();
        work();
        rotate1();
        sort(e,e+tope+1,cmp_d);
        for (i=0;i<=n;i++)uf[i]=i;
        for (i=0;i<=tope && e[i].d<=m;i++)
        {
                comb(e[i].x,e[i].y);
        }
        int ans2=0;
        for (i=0;i<n;i++)
        {
                is_root[get_fa(i)]=1;
                uf_size[uf[i]]++;
        }
        for (i=1;i<n;i++)
                is_root[i]+=is_root[i-1];
        for (i=0;i<n;i++)
                ans2=max(ans2,uf_size[i]);
        printf("%d %d\n",is_root[n-1],ans2);
        return 0;
}
时间: 2024-07-30 03:17:55

bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 曼哈顿生成树的相关文章

bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居——排序+贪心+set

Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个"群".每只奶牛在吃草的时候有一个独一无二的位置坐标Xi,Yi(l≤Xi,Yi≤[1..10^9]:Xi,Yi∈整数.当满足下列两个条件之一,两只奶牛i和j是属于同一个群的: 1.两只奶牛的曼哈顿距离不超过C(1≤C≤10^9),即lXi - xil+IYi - Yil≤C. 2.两只奶牛有共同的邻居.即,存在一只奶牛k,使i与k,j与k均同属一个群.

BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Treap

题意:链接 方法: Treap 解析: 前几道资格赛的题水的不行,这道Gold的题就够分量辣. 首先这个曼哈顿距离啥的肯定能做文章,怎么转化是个问题,自己玩了一会没玩出来,就查了查曼哈顿距离的转化,发现这个玩意转化之后就变得有思路多了,所以这数学本领还是很重要啊=-= 先看曼哈顿距离的定义 |x1?x2|+|y1?y2| 拆绝对值 x1?x2+y1?y2或x1?x2+y2?y1 x2?x1+y1?y2或x2?x1+y2?y1 即|x1+y1?(x2+y2)|或|x1?y1?(x2?y2)| 设x

【BZOJ】1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居

[算法]并查集+平衡树+数学 [题解] 经典哈夫曼距离转切比雪夫距离. 哈夫曼距离:S=|x1-x2|+|y1-y2| 即:max(x1-x2+y1-y2,x1-x2-y1+y2,-x1+x2+y1-y2,-x1+x2-y1+y2) 令X1=x1+y1,Y1=x1-y1, 切比雪夫距离:S=max(|X1-X2|,|Y1-Y2|). 转化为

bzoj1604[Usaco2008 Open]Cow Neighborhoods 奶牛的邻居*

bzoj1604[Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 题意: n只牛,牛结成群当且仅当两只牛曼哈顿距离≤c或存在第三头牛使两头牛与它的曼哈顿距离都≤c,求最大的群和群数.n≤100000 题解: 好神啊.先把曼哈顿距离转成切比雪夫距离,(x,y)转为(x+y,x-y).然后按x坐标排序,用两个指针维护使x坐标差值≤c,同时将新插入的y坐标放入set,每次在set里查找出与当前y差值不超过c的最大y,将这两个点合并成一个集合,用并查集维护. 代码: 1 #

【bzoj1604】[Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 并查集+Treap/STL-set

题目描述 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的时候有一个独一无二的位置坐标Xi,Yi(l≤Xi,Yi≤[1..10^9]:Xi,Yi∈整数.当满足下列两个条件之一,两只奶牛i和j是属于同一个群的: 1.两只奶牛的曼哈顿距离不超过C(1≤C≤10^9),即lXi - xil+IYi - Yil≤C. 2.两只奶牛有共同的邻居.即,存在一只奶牛k,使i与k,j与k均同属一个群. 给出奶牛们的位置,请计算

bzoj 1623: [Usaco2008 Open]Cow Cars 奶牛飞车

1623: [Usaco2008 Open]Cow Cars 奶牛飞车 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 325  Solved: 223[Submit][Status][Discuss] Description 编号为1到N的N只奶牛正各自驾着车打算在牛德比亚的高速公路上飞驰.高速公路有M(1≤M≤N)条车道.奶牛i有一个自己的车速上限Si(l≤Si≤1,000,000). 在经历过糟糕的驾驶事故之后,奶牛们变得十分小心,避免碰撞的发生

BZOJ 1623 [Usaco2008 Open]Cow Cars 奶牛飞车:贪心

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1623 题意: 编号为1到N的N只奶牛正各自驾着车打算在牛德比亚的高速公路上飞驰.高速公路有M(1≤M≤N)条车道.奶牛i有一个自己的车速上限Si(l≤Si≤1,000,000). 在经历过糟糕的驾驶事故之后,奶牛们变得十分小心,避免碰撞的发生. 每条车道上,如果某一只奶牛i的前面有K只奶牛驾车行驶,那奶牛i的速度上限就会下降K*D个单位,也就是说,她的速度不会超过Si - k*D(O≤D

1623: [Usaco2008 Open]Cow Cars 奶牛飞车

1623: [Usaco2008 Open]Cow Cars 奶牛飞车 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 291  Solved: 201[Submit][Status][Discuss] Description 编号为1到N的N只奶牛正各自驾着车打算在牛德比亚的高速公路上飞驰.高速公路有M(1≤M≤N)条车道.奶牛i有一个自己的车速上限Si(l≤Si≤1,000,000). 在经历过糟糕的驾驶事故之后,奶牛们变得十分小心,避免碰撞的发生

[BZOJ] 1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛

1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1312  Solved: 736[Submit][Status][Discuss] Description 奶牛们在被划分成N行M列(2 <= N <= 100; 2 <= M <= 100)的草地上游走,试图找到整块草地中最美味的牧草.Farmer John在某个时刻看见贝茜在位置 (R1, C1),恰好T