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=-;
- 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=;i<n;i++)
- pl[i].x=-pl[i].x;
- }
- void rotate2()
- {
- for (int i=;i<n;i++)
- pl[i].y=-pl[i].y;
- }
- void rotate3()
- {
- for (int i=;i<n;i++)
- swap(pl[i].x,pl[i].y);
- }
- qword h[MAXN],toph=-;
- 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=;
- memset(tarr,0x3f,sizeof(tarr));
- for (i=;i<n;i++)
- h[++toph]=pl[i].x-pl[i].y;
- sort(h+,h+toph+);
- toph=unique(h+,h+toph+)-h-;
- sort(pl,pl+n,cmp_x);
- for (i=;i<n;i++)
- {
- pair<qword,int> pr;
- qword t=pl[i].x-pl[i].y;
- t=lower_bound(h+,h+toph+,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=;i<n;i++)
- {
- scanf("%lld%lld",&pl[i].x,&pl[i].y);
- pl[i].id=i;
- }
- //
- work();
- //
- rotate3();
- work();
- rotate3();
- //
- rotate2();
- rotate3();
- work();
- rotate3();
- rotate2();
- //
- rotate2();
- work();
- rotate2();
- //
- rotate2();
- rotate1();
- work();
- rotate1();
- rotate2();
- //
- rotate1();
- rotate2();
- rotate3();
- work();
- rotate3();
- rotate2();
- rotate1();
- //
- rotate1();
- rotate3();
- work();
- rotate3();
- rotate1();
- //
- rotate1();
- work();
- rotate1();
- sort(e,e+tope+,cmp_d);
- for (i=;i<=n;i++)uf[i]=i;
- for (i=;i<=tope && e[i].d<=m;i++)
- {
- comb(e[i].x,e[i].y);
- }
- int ans2=;
- for (i=;i<n;i++)
- {
- is_root[get_fa(i)]=;
- uf_size[uf[i]]++;
- }
- for (i=;i<n;i++)
- is_root[i]+=is_root[i-];
- for (i=;i<n;i++)
- ans2=max(ans2,uf_size[i]);
- printf("%d %d\n",is_root[n-],ans2);
- return ;
- }
bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 曼哈顿生成树的更多相关文章
- BZOJ 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居
题目 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Time Limit: 5 Sec Memory Limit: 64 MB Description ...
- bzoj 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(set+并查集)
Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的 时候有一个独一无二的位置坐标Xi,Yi( ...
- bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居——排序+贪心+set
Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的时候有一个独一无二的位置坐标Xi,Yi(l ...
- BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居:队列 + multiset + 并查集【曼哈顿距离变形】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1604 题意: 平面直角坐标系中,有n个点(n <= 100000,坐标范围10^9) ...
- bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居【切比雪夫距离+并查集+multiset】
参考:http://hzwer.com/4361.html 坐标开long long,inf开大点 先曼哈顿转切比雪夫(x+y,x-y),距离就变成了max(x',y'): 先按x排序,维护两个指针, ...
- BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Treap
题意:链接 方法: Treap 解析: 前几道资格赛的题水的不行,这道Gold的题就够分量辣. 首先这个曼哈顿距离啥的肯定能做文章,怎么转化是个问题,自己玩了一会没玩出来,就查了查曼哈顿距离的转化,发 ...
- 【BZOJ】1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(set+并查集+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1604 这题太神了... 简直就是 神思想+神做法+神stl.. 被stl整的我想cry...首先,, ...
- 【BZOJ】1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居
[算法]并查集+平衡树+数学+扫描线 [题解] 经典曼哈顿距离转切比雪夫距离. 曼哈顿距离:S=|x1-x2|+|y1-y2|<=c 即:max(x1-x2+y1-y2,x1-x2-y1+y2, ...
- [BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居
[BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 试题描述 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发 ...
随机推荐
- linux 配置 Apache mysql php最新版
第一部分:安装mysql 官方下载 mysql5.6.19 64位的rpm格式文件 0.rpm 四个mysql5.6.19 卸载默认的mysql yum -y remove mysql-libs-* ...
- c语言学习
#include <stdio.h>void sum_diff(int *n1,int *n2,int *sum,int *diff){ *sum=*n1+*n2; *diff=(*n1& ...
- 制作一个类似苹果VFL的格式化语言来描述UIStackView
在项目中总是希望页面上各处的文字,颜色,字体大小甚至各个视图控件布局都能够在发版之后能够修改以弥补一些前期考虑不周,或者根据统计数据能够随时进行调整,当然是各个版本都能够统一变化.看到这样的要求后,第 ...
- StringBuffer跟StringBuilder以及HashMap跟HashTable
StringBuffer是线程安全的 HashTable是线程安全的,但HashMao单线程程序中的性能比HashTable要高,对了HashTable用(add),HashMap用的(put)
- Sql面试常考题(持续添加)
最近萌生换工作的念头,于是上网下载了一些公司的面试题,重新看了面试题中的Sql部分,这些查询题有时候只是兜一个弯角来考,对于给EF惯坏的孩子来说还是有点难度的(给面试官鄙视了几下的结果),所以列出最近 ...
- word ppt excel文档转换成pdf
1.把word文档转换成pdf (1).添加引用 using Microsoft.Office.Interop.Word; 添加引用 (2).转换方法 /// <summary> /// ...
- sharedPreference的奇怪bug
一定要清楚sp的结构,而且要知道是什么类型的.类型不对,会引起很多不知道的bug,比如本来是int类型的值,如果用String的类型去匹配,会让Activity开Activity Thread,不断地 ...
- python tornado+mongodb的使用
tornado tar xvzf tornado-1.2.1.tar.gz cd tornado-1.2.1 python setup.py build sudo python setup.py in ...
- ACM——回文
回文回文! 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte总提交:967 测试通过:338 描述 回文是一种有趣的现 ...
- thinkphp之wampserver安装
1.如何修改www目录 打开httpd.conf(wamp\bin\apache\Apache2.4.4\conf): 把DocumentRoot "c:/wamp/www" 修改 ...